我已经阅读了一些有关“或接近语法错误”的问答,但是没有一个能解决我的问题。
错误示例:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
psycopg2.ProgrammingError: syntax error at or near "UPDATE"
LINE 1: DECLARE "teste" CURSOR WITHOUT HOLD FOR UPDATE applicant SET...
^
请注意^
上的UPDATE
。我已经在pgadmin 4
上测试了更新脚本,并且一切正常。
脚本非常简单:
UPDATE applicant
SET cv_recrutai_entities = %s
WHERE id = %s
我的代码基本上是:
def _connect_database():
return psy.connect(
dbname=settings.DATABASE['DBNAME'],
host=settings.DATABASE['HOST'],
port=settings.DATABASE['PORT'],
user=settings.DATABASE['USER'],
password=settings.DATABASE['PASSWORD'],
application_name=settings.env
)
# Connects to database
conn = _connect_database()
# Creats a named cursor
cur = conn.cursor('test')
# Execute
cur.execute(update_script, ('{"json": "test"}', '00025ba0-748f-11e8-b0d3-d7108dd3af23'))
我已经在execute方法以及参数上明确编写了脚本,但是仍然遇到相同的错误:
cur.execute("UPDATE applicant SET cv_recrutai_entities = 'json here' WHERE id = '00025ba0-748f-11e8-b0d3-d7108dd3af23'")
请注意,我甚至删除了第一个参数('json here')中的双引号
我想念什么吗?!
答案 0 :(得分:5)
使用
cur = conn.cursor('test')
您正在尝试打开服务器端游标。 Per the documentation:
光标(名称=无,cursor_factory =无,scrollable =无,预扣=假)
使用该连接返回新的光标对象。
如果指定了名称,则返回的游标将是服务器端游标(也称为命名游标)。否则它将是常规的客户端游标。
仅使用
cur = conn.cursor()
服务器端(命名)游标只能用于SELECT或VALUES查询。他们实现了Postgres cursors:
查询
SELECT或VALUES命令,它将提供游标要返回的行。
使用命名的游标,结果数据将收集到服务器上,并在需要时(可能是部分发送)发送到客户端。数据仅在打开游标的事务期间存储,因此commit
或rollback
会释放数据。
客户端(未命名)游标使您可以执行任何有效的SQL查询。执行查询后,可能的结果集会立即发送到客户端。
可以通过单个连接使用已命名和未命名的游标,但是如果要同时执行此操作,则应该使用两个单独的连接。