Я все еще изучаю PostgreSQL. Во время моего тестирования я использовал оператор INSERT только в psycopg2 и теперь asyncpg. Теперь у меня есть необходимость ОБНОВИТЬ данные в моей тестовой базе данных, а не заменять их все
В настоящее время я пытаюсь выполнить простой тест замены в таблице тестирования, прежде чем перейти к таблице разработки с большим количеством данных.
Я хочу заменить любое имя в $ 1, находящееся в CONFLICT, на имя, которое уже есть в таблице users. Я пытаюсь код запроса, который передается в БД через asyncpg. Я продолжаю получать ошибки синтаксиса, поэтому я немного растерялся, как исправить эти ошибки.
Каков правильный синтаксис для этого запроса?
'''INSERT INTO users(name, dob)
VALUES($1, $2)
ON CONFLICT (name)
DO
UPDATE "users"
SET name = 'TEST'
WHERE name = excluded.name '''
UPDATE:
Я получаю это сообщение об ошибке при использовании asyncpg:
asyncpg.exceptions.PostgresSyntaxError: syntax error at or near ""users""
Я получаю это сообщение об ошибке при использовании psycopg2:
psycopg2.ProgrammingError: syntax error at or near ""users""
Это код 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))