将psycopg2转换为asyncpg格式。 “语法错误在或接近“%””

时间:2019-07-03 11:51:03

标签: psycopg2 asyncpg

我正在将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 :(得分:0)

您要自行格式化查询。您从不应该这样做。另外,我建议您事先为每个传入符号创建表,不要动态地执行此操作。

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()