在“ UPDATE”或附近的psycopg2语法错误

leo*_*het 1 python postgresql psycopg2 sql-update

我已经读过一些有关“语法错误在或附近”的问答,但是没有一个可以解决我的问题。

错误示例:

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...
                                                ^
Run Code Online (Sandbox Code Playgroud)

请注意^右侧的UPDATE。我已经测试了更新脚本,pgadmin 4并且一切正常。

该脚本非常简单:

UPDATE applicant
SET cv_recrutai_entities = %s
WHERE id = %s
Run Code Online (Sandbox Code Playgroud)

我的代码基本上是:

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'))
Run Code Online (Sandbox Code Playgroud)

我已经在execute方法以及参数上明确编写了脚本,但是仍然遇到相同的错误:

cur.execute("UPDATE applicant SET cv_recrutai_entities = 'json here' WHERE id = '00025ba0-748f-11e8-b0d3-d7108dd3af23'")
Run Code Online (Sandbox Code Playgroud)

请注意,我什至从第一个参数(“ json here”)中删除了双引号

我错过了什么吗?

kli*_*lin 5

cur = conn.cursor('test')
Run Code Online (Sandbox Code Playgroud)

您正在尝试打开服务器端游标。根据文档:

cursor(名称=无,cursor_factory =无,可滚动=无,保留= False)

使用该连接返回一个新的光标对象。

如果指定了名称,则返回的游标将是服务器端游标(也称为命名游标)。否则它将是常规的客户端游标。

仅使用

cur = conn.cursor()
Run Code Online (Sandbox Code Playgroud)

服务器端(命名)游标只能用于SELECT或VALUES查询。它们实现了Postgres游标:

询问

SELECT或VALUES命令,它将提供游标要返回的行。

使用命名游标,结果数据将收集到服务器上,并在需要(获取)时发送(可能是部分发送)到客户端。数据仅在打开commit或打开游标的事务期间存储rollback

客户端(未命名)游标使您可以执行任何有效的SQL查询。执行查询后,可能的结果集将立即发送到客户端。

可以通过单个连接使用已命名和未命名的游标,但是如果要同时执行此操作,则应使用两个单独的连接。

  • 服务器端游标只能用于“ SELECT”或“ VALUES”查询(请参阅@muistooshort的注释)。我认为您应该使用两个连接来同时运行客户端和服务器端游标。 (2认同)