代码之家  ›  专栏  ›  技术社区  ›  leoschet

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

  •  1
  • leoschet  · 技术社区  · 7 年前

    错误示例:

    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')的双引号

    我错过什么了吗?!

    1 回复  |  直到 7 年前
        1
  •  7
  •   klin    7 年前

    cur = conn.cursor('test')
    

    您正在尝试打开服务器端游标。 Per the documentation:

    游标(名称=无,游标工厂=无,可滚动=无,保留=假)

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

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

    使用just

    cur = conn.cursor()
    

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

    查询

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

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

    客户端(未命名)游标允许执行任何有效的SQL查询。可能的结果集在执行查询后立即发送给客户端。

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