从python脚本执行psql命令

时间:2019-12-24 09:04:16

标签: python sql postgresql subprocess psql

以什么方式可以从Python脚本执行psql命令?我的代码从PostgreSQL数据库插入和更新数据(使用psycopg2和cursor方法)。当我执行

这样的查询时,效果很好
cursor.execute("UPDATE Segment set idcurve = %s where id = %s ", (id_curve, id_segment,))

但是在psql情况下,当我将命令传递给cursor.executesee 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

1 个答案:

答案 0 :(得分:1)

似乎您正在尝试通过psycopg2运行Meta-Command,类似于this question。 Psycopg2无法处理元命令,这就是为什么它会引发此语法错误。

this question中的以下内容可能适合您的情况:

  

这是非常重要的信息,命令行psql -E将回显用于实现\ d和其他反斜杠命令的SQL查询(无论何时在psql提示符中使用其中的一个),就像@piro在注释中写道。这样,您可以轻松获得所需的东西。

编辑:否则,您将不得不使用子过程,因为注释已经指出。