对基于声明的模型使用多值插入时,不会为每一行单独调用 Python 端默认值

标签 python orm sqlalchemy

我正在使用 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/

相关文章:

python - 更新 : loosing the initial value 中带有小部件的 Django 表单 DateInput

python - 如何最好地终止 python 线程?

java - 从 Scala(或 Java)使用 python 代码的最佳方式是什么?

python - 是否有最佳实践方法来实现以不同方式处理 Windows 和 Linux 环境的 Python 脚本?

python - SQLAlchemy - 如何查询 3 个表(带关联表)

SQLAlchemy:为列的每个不同值选择一行

java - Hibernate 与连接表的映射异常

java - Hibernate @OneToMany - child 拥有关系,但只有 parent id

java - 只读模式下不允许写操作 (FlushMode.MANUAL)

python - 我如何编写一个 SQLAlchemy 查询来返回图中某个节点的所有后代?