我还在学习 PostgreSQL。在我的测试期间,我只在 psycopg2 和现在的 asyncpg 中使用了 INSERT 语句。我现在需要更新我的测试数据库中的数据,而不是全部替换。
我目前正在尝试在测试表中进行简单的替换测试,然后再转到具有更多数据的开发表。
我想用表 users 中已经存在的名称替换 CONFLICT 中的任何 $1 名称。我正在尝试通过 asyncpg 传递给数据库的查询代码。我不断收到语法错误,所以我对如何纠正这些错误有点迷茫。
此查询的正确语法是什么?
'''INSERT INTO users(name, dob)
VALUES($1, $2)
ON CONFLICT (name)
DO
UPDATE "users"
SET name = 'TEST'
WHERE name = excluded.name '''
更新:
使用 asyncpg 时收到此错误消息:
asyncpg.exceptions.PostgresSyntaxError: syntax error at or near ""users""
使用 psycopg2 时收到此错误消息:
psycopg2.ProgrammingError: syntax error at or near ""users""
这是我用来执行 INSERT 的 asyncpg 代码:
async def insert_new_records(self, sql_command, data):
print (sql_command)
async with asyncpg.create_pool(**DB_CONN_INFO, command_timeout=60) as pool:
async with pool.acquire() as conn:
try:
stmt = await conn.prepare(sql_command)
async with conn.transaction():
for value in data:
async for item in stmt.cursor(*value):
pass
finally:
await pool.release(conn)
test_sql_command = '''
INSERT INTO users(name, dob)
VALUES($1, $2)
ON CONFLICT (name)
DO
UPDATE "users"
SET name = 'TEST'
WHERE name = excluded.name '''
# The name 'HELLO WORLD' exists in the table, but the other name does not.
params = [('HELLO WORLD', datetime.date(1984, 3, 1)),
('WORLD HELLO', datetime.date(1984, 3, 1))]
loop = asyncio.get_event_loop()
loop.run_until_complete(db.insert_new_records(test_sql_command, params))