以什么方式可以从Python脚本执行psql命令?我的代码从PostgreSQL数据库插入和更新数据(使用psycopg2和cursor方法)。当我执行
这样的查询时,效果很好cursor.execute("UPDATE Segment set idcurve = %s where id = %s ", (id_curve, id_segment,))
但是在psql情况下,当我将命令传递给cursor.execute
(see edits to similar question)时,我得到SyntaxError: syntax error at or near "\"
。
而且,该命令在console.sql DataGRIP中失败(无论如何,它会为所有行执行...)
此命令仅在shell中有效吗(我必须使用os.system)吗? cursor
无法解释?
编辑 尝试子流程:
import subprocess
sql = """SELECT uuid IS NULL AS is_uuid FROM dpoint WHERE uuid = '5547f4b7-00b3-4aac-8ceb-c9ca163a0214';
\gset
\if :is_uuid
INSERT INTO DPoint (uuid) VALUES ('5547f4b7-00b3-4aac-8ceb-c9ca163a0214');
WITH ins1 AS (INSERT INTO Point (latitude, longitude, srid)
VALUES (64.44, 28.77, 4326) RETURNING id AS id_point)
INSERT INTO SPoint (idPoint, uuiddpt) VALUES ((SELECT id_point FROM ins1), '5547f4b7-00b3-4aac-8ceb-c9ca163a0214');
\endif
"""
subprocess.check_call(['psql -h localhost -d dbase -U myuser -W --command={}'.format(sql)], env={'PGPASSWORD': 'mypass'})
抛出OSError: [Errno 36] File name too long
EDIT2
subprocess.check_call(['psql', '-q', '-U', 'myuser', '-h', 'localhost', '-c', '{}'.format(sql), 'dbase'], env={'PGPASSWORD': 'mypass'})
当我分解所有参数时,查询将尝试执行->它以syntax error at or near "\"
失败。 -E
(如Lu M的建议)没有帮助。如果我将查询保存到.sql文件,但是我想以交互方式执行该查询,则可以使用它。
EDIT3
根据--command = command章节中的psql tutorial,有两个选项可用于混合SQL和psql元命令。有什么可能将其包装在子流程中? 我都尝试过,但是出现了多余的反斜杠,并且无法将其识别为一个命令:
subprocess.check_call(['psql', '-q', '-U', 'myuser', '-h', 'localhost',
'-c', '{}'.format(sql),
'-c', '{}'.format('\gset'),
'-c', '{}'.format('\if :is_uuid '),
'-c', '{}'.format(sql2),
'-c', '{}'.format('\endif'), 'dbase'],
env={'PGPASSWORD': 'mypass'})
失败unrecognized value ":is_uuid" for "\if expression": Boolean expected
答案 0 :(得分:1)
似乎您正在尝试通过psycopg2运行Meta-Command,类似于this question。 Psycopg2无法处理元命令,这就是为什么它会引发此语法错误。
this question中的以下内容可能适合您的情况:
这是非常重要的信息,命令行psql -E将回显用于实现\ d和其他反斜杠命令的SQL查询(无论何时在psql提示符中使用其中的一个),就像@piro在注释中写道。这样,您可以轻松获得所需的东西。
编辑:否则,您将不得不使用子过程,因为注释已经指出。