我正在使用 sqlalchemy==1.1.4
。我完全陷入了尝试为从 insert
类继承的模型执行多值 DeclarativeMeta
的过程中。
我有下一个声明:
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class SomeClass(Base):
id = sa.Column(sa.String(length=64), primary_key=True,
default=lambda: str(uuid4()))
is_active = sa.Column(sa.Boolean, default=True)
service_id = sa.Column(sa.String(length=100), nullable=False)
order = sa.Column(sa.SmallInteger, default=0)
当我尝试多值插入时:
con.execute(
sa.insert(SomeClass).values([
{SomeClass.service_id: '12'},
{SomeClass.service_id: '34'},
])
)
它抛出
sqlalchemy.exc.CompileError: INSERT value for column SomeClass.service_id is
explicitly rendered as a boundparameter in the VALUES clause; a
Python-side value or SQL expression is required
根据 Michael Bayer 的帖子 link 无论如何,我的代码似乎是正确的,但它甚至没有编译为 sql 表达式。虽然下一个完美地工作:
con.execute(
sa.insert(SomeClass).values([
{SomeClass.service_id.key: '12'},
{SomeClass.service_id.key: '34'},
])
)
有人知道这是什么鬼吗?)
最佳答案
仅当您传递给 insert.values()
的元素列表包含不一致的键时才会发生该错误,这意味着您可能有一个类似的列表:[{'name': 'foo', code:'foo'}, {'name': 'bar'}]
关于对基于声明的模型使用多值插入时,不会为每一行单独调用 Python 端默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44333141/