如何解决使用sqlite批量插入和返回ID
我了解sqlite不支持RETURNING,至少这是sqlAlchemy告诉我的:
sqlalchemy.exc.CompileError: RETURNING is not supported by this dialect's statement compiler.
使用sqlAlchemy的Core库时出现此错误。这是一个代码示例:
from sqlalchemy.engine.url import URL
from sqlalchemy import create_engine,MetaData
from sqlalchemy import Table,Column,Integer,String
engine = create_engine('sqlite:///:memory:',echo=False)
# create table
meta = MetaData(engine)
table = Table('userinfo',meta,Column('id',primary_key=True),Column('first_name',String),Column('age',Integer),)
meta.create_all()
# generate rows
data = [{'first_name': f'Name {i}','age': 18+i} for i in range(10)]
# this seems to work on PostgreSQL only
stmt = table.insert().values(data).returning(table.c.id)
for rowid in engine.execute(stmt).fetchall():
print(rowid['id'])
现在,当我在sqlAlchemy的ORM库中使用类似的代码时,将返回ID。这是源代码:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,String
from sqlalchemy import ForeignKey
from sqlalchemy.orm import sessionmaker,scoped_session
from sqlalchemy.orm import relationship
Base = declarative_base()
class UserInfo(Base):
__tablename__ = "userinfo"
id = Column(Integer,primary_key=True)
first_name = Column(String)
age = Column(Integer)
engine = create_engine('sqlite:///:memory:',echo=False)
Base.metadata.create_all(engine)
session = scoped_session(sessionmaker(bind=engine))
data = [dict(first_name=f'Name {i}',age=18+1) for i in range(10)]
session.bulk_insert_mappings(UserInfo,data,return_defaults=True)
session.commit()
print([s['id'] for s in data])
为什么核心一台没有运行,这怎么办?当我查看生成的sql时,看不到。
解决方法
经过一番挖掘,我发现了这个link
在本文档中,bulk_insert_mappings的使用仅为Batched INSERT statements via the ORM "bulk",using dictionaries.
。设置return_defaults=True
时,我假设sqlalchemy反复calling upon last row id
。因此,这些ID可用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。