Я использую Session.bulk_insert_mappings() для вставки нескольких объектов, но у меня возникает проблема, когда объекты имеют значения None
.SQLAlchemy объемная вставка с нулевыми колонами
Следующая основная вставка отлично работает, один оператор вставки используется для вставки все объекты:
session.bulk_insert_mappings(Document, [
dict(document_id=1, version=1, colA=True, colB='a'),
dict(document_id=2, version=1, colA=True, colB='b'),
dict(document_id=3, version=1, colA=True, colB='c')
])
Но когда один из полей None
, SQLAlchemy разделится вставку в нескольких операторов:
session.bulk_insert_mappings(Document, [
dict(document_id=1, version=1, colA=True, colB='a'),
dict(document_id=2, version=1, colA=True, colB=None),
dict(document_id=3, version=1, colA=True, colB='c')
])
Log:
INFO [...] INSERT INTO api.documents (...) VALUES (...)
INFO [...] {'colA': True, 'colB': 'a', 'version': 1, 'document_id': 1}
INFO [...] INSERT INTO api.documents (...) VALUES (...)
INFO [...] {'colA': True, 'version': 1, 'document_id': 2}
INFO [...] INSERT INTO api.documents (...) VALUES (...)
INFO [...] {'colA': True, 'colB': 'c', 'version': 1, 'document_id': 3}
Я пытался заменить None
с null(), но затем я получаю следующее сообщение об ошибке «не может адаптироваться типа" Null»:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'Null' [SQL: 'INSERT INTO api.documents (...) VALUES (...)'] [parameters: ({'colB': 'a', 'colA': True, 'version': 1, 'document_id': 1}, {'colB': <sqlalchemy.sql.elements.Null object at 0x7f74679c0190>, 'colA': True, 'version': 1, 'document_id': 2}, {'colB': 'c', 'colA': True, 'version': 1, 'document_id': 3})]
Как я могу убедиться, что один оператор вставки, даже когда некоторые лица имеют None
значения?
Edit: отображение выглядит следующим образом:
class Document(Base):
__tablename__ = 'documents'
document_id = Column(Integer, primary_key=True)
version = Column(Integer, nullable=False, server_default='1')
colA = Column(Boolean)
colB = Column(Integer)
Вы пытались опустить 'colB'? –
@TomaszJakubRup Я просто попробовал, но это тот же результат (сделаны 3 вставных заявления). – tsauerwein
Пожалуйста, покажите класс 'mapper' (' Document') –