使用SQLAlchemy向PostgreSQL数据库插入数据时忽略未使用的列

4

我想从Python字典中将数据插入到表中。但是我的字典包含的键比表中的列更多。因此,插入时会出现错误 sqlalchemy.exc.CompileError:未使用的列名:column_name。我只想插入存在于表中的列名并忽略额外的列。

如何使用sqlalchemy实现这一点?

我正在使用的代码是

from sqlalchemy import *
from sqlalchemy.dialects import postgresql

db = create_engine('postgresql+psycopg2://localhost:5432/postgres')
meta = MetaData()
meta.bind = db

data = [{
    'a': 1,
    'b': 2,
    'c': 3,
    'd': 4,
    'e': 5,
    'f': 6
}]

ins_stmt = postgresql.insert(table_object).values(data)
db.execute(ins_stmt)

我的table_object包含列a、b、c、d和e。

P.S. - 我正在使用sqlalchemy 1.4

1个回答

4
我不知道任何方法可以让insert丢弃额外的项目,所以它们必须事先被过滤掉。你可以通过将表的列名与字典的键进行比较来实现这一点。
column_names = table_object.columns.keys()
fixed = [{k: v for k, v in d.items() if k in column_names} for d in data]

ins_stmt = postgresql.insert(table_object).values(fixed)
with engine.connect() as conn:
    with conn.begin():
        conn.execute(ins_stmt)


1
如果我没记错的话,kd.keys() 中总是存在的,所以在这里不需要使用 & - Mattwmaster58
@Mattwmaster58 很好的观点,我已经删除了多余的部分。 - snakecharmerb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接