【问题标题】:updating PosgreSQL database via SQLalchemy; syntax error通过 SQLalchemy 更新 PostgreSQL 数据库;语法错误
【发布时间】:2020-07-10 00:24:54
【问题描述】:

我在 PostgreSQL 数据库中有两个表;表 1,表 2。它们都包含一个 id 列。我想将 table2 中的一列(比如 col1)添加到 table1 中,其中 table1.id = table2.id。

我试图通过 SQLalchemy 来实现这一点。我不断收到以下错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.SyntaxError) syntax error at or near "INNER"

这是一个sn-p的代码:

engine = create_engine(...)

with engine.connect() as con:
   con.execute("ALTER TABLE table1 ADD COLUMN col1 text")
   con.execute("UPDATE table1  \
                INNER JOIN table2 ON table1.id = table2.id \
                SET table1.col1 = table2.col1")

为什么会出现这个错误?

【问题讨论】:

    标签: sql python-3.x postgresql


    【解决方案1】:

    PostgreSQL 不支持UPDATE...JOIN,如 MySQL 和 MS Access。但是,Postgres 确实支持 UPDATE...FROM 甚至 UPDATE...FROM...JOIN

    con.execute("""UPDATE table1 t1
                   SET col1 = t2.col1
                   FROM table2 t2
                   WHERE t1.id = t2.id""")
    

    【讨论】:

    • 我不断收到错误消息:sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) missing FROM-clause entry for table "table2"?
    • 数据库中是否有名为table2 的表?错误标题为UndefinedTable
    • 我忘了把模式放在表名前面。感谢您的帮助
    【解决方案2】:

    在 postgres 中更新时不能直接加入,并且加入的方式不正确。请使用以下查询,

    update table1 set table1.col1 = qry.col1
    from
    (select col1 from table2) qry
    where 
    table1.id = table2.qry;
    

    【讨论】:

      【解决方案3】:

      这不是update 的正确语法。请看https://www.postgresql.org/docs/current/sql-update.html

      update table1
         set col1 = table2.col1
        from table2
       where table2.id = table1.id;
      

      【讨论】:

        【解决方案4】:

        在 postgresql 中使用另一个表进行更新的正确语法:

         UPDATE table1 
         set table1.col1 = table2.col1
         FROM table2 
         where  table1.id = table2.id
        

        【讨论】:

        • 这里要小心。 Postgres 不允许target columns in SET to be aliased。对于新手来说是一个令人沮丧和奇怪的错误。
        • 有效:复制/粘贴原始结果的错误
        猜你喜欢
        • 2021-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-28
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        • 2020-09-07
        相关资源
        最近更新 更多