Конвертировать psycopg2 в формат asyncpg.msgstr "синтаксическая ошибка в или около"% "" - PullRequest
0 голосов
/ 03 июля 2019

Я конвертирую скрипт postgres в asyncpg.

я получаю "asyncpg.exceptions.PostgresSyntaxError: синтаксическая ошибка на уровне или около"% ""

Я предполагаю, что мой заполнитель неверен, но не могу найти пример правильного формата.

Оригинальный рабочий код psycopg2:

async def commit_trade_postgres(response_data_input):
conn = await psycopg2.connect(
    "dbname='postgres' user='postgres' password = 'postgres123' host='localhost' port= '5432'")
cur = conn.cursor()
cur.execute(
    "CREATE TABLE IF NOT EXISTS trade_{symbol} (time timestamptz NOT NULL ,side text, size float, price float, tick_direction text)".format(**response_data_input))
conn.commit()
cur.execute(
    "SELECT create_hypertable('trade_{symbol}', 'time', if_not_exists => TRUE)".format(**response_data_input))
conn.commit()
cur.execute("INSERT INTO trade_{symbol} (time, side, size, price, tick_direction) VALUES (now(),  %(side)s, %(size)s, %(price)s, %(tick_direction)s)".format(
    **response_data_input), (response_data_input))
conn.commit()
print("commited trade")

Моя попытка в соответствии с примером кода, предоставленным в документации:

async def commit_trade_postgres(response_data_input):
conn = await asyncpg.connect(database='postgres',  user='postgres',  password='postgres123',  host='localhost',  port='5432')
await conn.execute(
    "CREATE TABLE IF NOT EXISTS trade_{symbol} (time timestamptz NOT NULL ,side text, size float, price float, tick_direction text)".format(**response_data_input))
await conn.execute(
    "SELECT create_hypertable('trade_{symbol}', 'time', if_not_exists => TRUE)".format(**response_data_input))
await conn.execute("INSERT INTO trade_{symbol} (time, side, size, price, tick_direction) VALUES (now(),  %(side)s, %(size)s, %(price)s, %(tick_direction)s)".format(
    **response_data_input), (response_data_input))
print("commited trade")

РЕДАКТИРОВАТЬ: образец запроса, который я извлекаю «данные» как диктовку.

response_dict_instrument = {'topic': 'instrument.BTCUSD', 'data': [{'symbol': 'BTCUSD', 'mark_price': 12367.29, 'index_price': 12360.1}]}

1 Ответ

0 голосов
/ 05 июля 2019

Вы форматируете запрос самостоятельно.Вы никогда не должны этого делать.Также я бы предложил вам заранее создать таблицу для каждого входящего символа, не делайте этого динамически.

Шаблон Asyncpg использует знак $ с номером для подстановки значений для запроса. doc

Таким образом, синтаксис должен быть таким, если в качестве входных данных используется словарь.


async def save_input(input):
    # create connection
    conn = ...
    trade_symbol = input['symbol']
    query = "create table if not exists trade_{trade_symbol} ... ".format(trade_symbol=trade_symbol) # your column names go here
    await conn.execute(query)
    query = "SELECT create_hypertable('trade_{trade_symbol} ...".format(trade_symbol=trade_symbol)
    await conn.execute(query)

    # i'm not copyng your exact keys, you should do it yourself
    values = (input['key1'], input['key2'], input['key3'])
    query = "insert into trade_{trade_symbol} (key1, key2, key3) values ($1, $2, $3);".format(trade_symbol=trade_symbol)
    await conn.execute(query, *values)

    await conn.close()

...