【问题标题】:SQLAlchemy Upsert unable to find table "excluded"SQLAlchemy Upsert 无法找到“排除”表
【发布时间】:2018-08-08 23:18:20
【问题描述】:

免责声明:我最近接管了其他人的代码库,因此您在此处看到的一些代码已经预制。我还将某些变量名称更改为更通用的代码名称,这可能实际上不起作用。

我正在尝试使用 SQLAlchemy 在 postgres 数据库上批量更新插入,但遇到了麻烦。似乎当 SQLAlchemy 去访问它需要更新表的数据时 (excluded.columnName) 是找不到的。

首先是我得到的错误:

    Missing FROM-clause entry for table "excluded"
    LINE 1: ...tablename) VALUES (excluded.tablename...

还有我的代码:

    index_fields = list(billocity_db.get_indexes(self.table_name))
    for row in self.data:
        if 'id' in self.column_info.keys():
            del row['id']
        data = row.to_dict()
        insert_stmt = insert(self.table).values(data)
        for i in index_fields:
            if i in data:
                del data[i]
        for key in data.keys():
            data[key] = insert_stmt.excluded[key]
            print(data[key])
        print(data)
        insert_stmt = insert_stmt.on_conflict_do_update(
            #Tried both constraint and index_elements with same result
            #constraint=self.table_name,
            #None of my columns are 'id'. Could that be an issue?
            index_elements=['id'],
            set_=data
        )
        try:
            print(insert_stmt)
            self.session.execute(insert_stmt)
        except Exception as e:
            self.session.rollback()
            self.log.exception(str(e))
        finally:
            self.session.commit()

调用后立即出现错误

self.session.execute(insert_stmt)

这就是 insert_stmt 在执行之前打印的内容,显然 column_name 和 table_name 只是占位符。

 INSERT INTO
 table_name (column_name, column_name, column_name, 
 column_name, column_name, column_name, column_name, 
 column_name, column_name, column_name, column_name, 
 column_name, column_name, column_name, column_name, 
 column_name) 
 VALUES
    (
 excluded.column_name, excluded.column_name, excluded.column_name, 
 excluded.column_name, excluded.column_name, excluded.column_name, 
 excluded.column_name, excluded.column_name, excluded.column_name, 
 excluded.column_name, excluded.column_name, excluded.column_name, 
 excluded.column_name, excluded.column_name, excluded.column_name, 
 excluded.column_name
 )
 ON CONFLICT (id) DO 
 UPDATE SET
 column_name= excluded.column_name, column_name= excluded.column_name, 
 column_name= excluded.column_name, column_name= excluded.column_name, 
 column_name= excluded.column_name, column_name= excluded.column_name, 
 column_name= excluded.column_name, column_name= excluded.column_name, 
 column_name= excluded.column_name, column_name= excluded.column_name, 
 column_name= excluded.column_name, column_name= excluded.column_name, 
 column_name= excluded.column_name, column_name= excluded.column_name, 
 column_name= excluded.column_name, column_name= excluded.column_name 
 RETURNING 
 table_name.id

我在网上找不到很多关于这个问题的额外资源,我不知道还有什么可以尝试的。任何帮助将不胜感激。

【问题讨论】:

    标签: python postgresql sqlalchemy upsert


    【解决方案1】:

    EXCLUDEDUPDATE 部分中可用,但在VALUES 部分中不可用。

    这是a good tutorial about UPSERT

    而且总是有INSERT ON CONFLICT 的官方文档

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2011-11-25
      • 2021-08-09
      • 1970-01-01
      • 2019-11-14
      相关资源
      最近更新 更多