在 QuestDB 启动时创建表

问题描述 投票:0回答:1

我正在容器上运行 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;

自动将表迁移到数据库的最佳和最简单的方法是什么??

database time-series questdb
1个回答
0
投票

由于上面的脚本使用的是 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,因此命令将被忽略,而不是在表已存在时返回错误。

另请注意,我省略了第二个容器上的环境变量,但我们可能希望将端口添加为环境变量。

© www.soinside.com 2019 - 2024. All rights reserved.