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

Ale*_*nov 3 python orm sqlalchemy

我正在使用sqlalchemy==1.1.4. 我完全陷入了尝试为insertDeclarativeMeta类继承的模型执行多值的过程中。我有下一个声明:

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)
Run Code Online (Sandbox Code Playgroud)

当我尝试多值插入时:

con.execute(
    sa.insert(SomeClass).values([
        {SomeClass.service_id: '12'},
        {SomeClass.service_id: '34'},
    ])
)
Run Code Online (Sandbox Code Playgroud)

它抛出

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
Run Code Online (Sandbox Code Playgroud)

根据 Michael Bayer 的帖子链接,无论如何我的代码似乎是正确的,但它甚至没有编译为 sql 表达式。虽然下一个完美地工作:

con.execute(
    sa.insert(SomeClass).values([
        {SomeClass.service_id.key: '12'},
        {SomeClass.service_id.key: '34'},
    ])
)
Run Code Online (Sandbox Code Playgroud)

有人知道这是什么鬼吗?)

elk*_*nas 6

只有当您传递给的元素列表insert.values()包含不一致的键时,才会发生该错误,这意味着您可能有一个类似的列表:[{'name': 'foo', code:'foo'}, {'name': 'bar'}]