我正在容器上运行 QuestDB,使用此定义
questdb:
image: questdb/questdb:8.2.1
container_name: questdb_trades
restart: always
ports:
- "${QUESTDB_HTTP_PORT}:9000" # Web Console, ILP over HTTP and REST API
- "${QUESTDB_PG_PORT}:8812" # PG port
environment:
QDB_HTTP_PORT: 9000
QDB_PG_PORT: 8812
volumes:
- questdb:/root/.questdb
我想在服务器启动时创建一个表
-- Table for 'kline'
CREATE TABLE kline (
timestamp TIMESTAMP, -- K-line start time
symbol SYMBOL INDEX CAPACITY 100000, -- Contract name (indexed for fast lookups)
interval SYMBOL, -- K-line interval (e.g., Min1, Min5, Day1)
open_price DOUBLE, -- Opening price
close_price DOUBLE, -- Closing price
high_price DOUBLE, -- Highest price
low_price DOUBLE, -- Lowest price
total_amount DOUBLE, -- Total transaction amount (a)
total_volume DOUBLE, -- Total transaction volume (q)
window_start TIMESTAMP, -- Window start time (t)
source_ts TIMESTAMP -- Source timestamp (ts)
)
TIMESTAMP(timestamp) PARTITION BY MONTH;
自动将表迁移到数据库的最佳和最简单的方法是什么??
由于上面的脚本使用的是 docker compose,在这种情况下,我们可以启动第二个依赖于 questdb 服务的服务并调用 Questdb 的 REST API。
更改 QuestDB 服务的入口点是很诱人的,但我更喜欢有一个单独的服务来保持清洁,而且因为 questdb 映像具有所需的最少库,并且其中不包含curl/wget 或类似的库。我曾经使用 perl 对此做过解决方法,它可以在图像上使用,但它很混乱,我更喜欢在启动时使用轻量级服务。
这是最低限度的工作
docker-compose.yml
services:
questdb:
image: questdb/questdb:8.2.1
container_name: questdb_trades
restart: always
ports:
- "${QUESTDB_HTTP_PORT}:9000" # Web Console, ILP over HTTP and REST API
- "${QUESTDB_PG_PORT}:8812" # PG port
- "${QUESTDB_METRICS_PORT}:9003" # Metrics and Health Check
environment:
QDB_HTTP_PORT: 9000
QDB_PG_PORT: 8812
QDB_METRICS_PORT: 9003
table_creator:
image: curlimages/curl
depends_on:
- questdb
command: >
/bin/sh -c "
# wait for the questdb server to be fully operational
while ! curl -s questdb:9003; do
sleep 1;
done;
# issue the desired API call
curl -G http://questdb:9000/exec --data-urlencode 'query=SHOW TABLES;'
我所做的更改是打开 questdb 容器上的 9003 端口(这样我就可以访问运行状况检查),然后只需添加curl 容器来检查运行状况服务器并发出我们需要的任何命令。
我们还可以向curl容器添加一个卷,这样我们就可以在本地文件系统上进行启动查询,并在启动时使用CURL从文件中读取查询的内容。
请注意,在调用 QuestDB API 时,我们每次调用只能执行一条 SQL 语句,因此我们需要发出与需要创建的表一样多的剩余调用。我们可以在本地文件系统上为每个语句创建一个文件,并使用 bash 循环来读取文件并逐个发送语句。如果顺序很重要,我们可以使用 000_ 111_ 222_ 333_ 等前缀,这样我们就可以轻松地从 bash 脚本中对它们进行排序。
由于这将在堆栈的每次启动时运行,因此我们可能希望使用 CREATE TABLE IF NOT EXISTS,因此命令将被忽略,而不是在表已存在时返回错误。
另请注意,我省略了第二个容器上的环境变量,但我们可能希望将端口添加为环境变量。