Python-side defaults are not invoked for each row individually when using a multivalued insert for Declarative-based models

Viewed 1868

I'm using sqlalchemy==1.1.4. And I completely got stuck trying to execute multivalued insert for model inherited from DeclarativeMeta class. I have next declaration:

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)

when I try multivalued insert like:

con.execute(
    sa.insert(SomeClass).values([
        {SomeClass.service_id: '12'},
        {SomeClass.service_id: '34'},
    ])
)

It throws

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

According to Michael Bayer's post link my code seemed to be correct by anyway, but it's even not compiled to sql expression. Though the next works perfectly:

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

Anybody knows what's the heck?)

1 Answers

That error should only occur if the list of elements you're passing to insert.values() contains inconsistent keys, Which means you may have a list like : [{'name': 'foo', code:'foo'}, {'name': 'bar'}]

Related