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

时间:2017-06-02 16:04:07

标签: 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'},
    ])
)

谁知道到底是什么?)

1 个答案:

答案 0 :(得分:0)

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

的列表