使用sqlite大容量插入和返回ID
我知道sqlite不支持返回,至少这是sqlAlchemy告诉我的:使用sqlite大容量插入和返回ID,sqlite,sqlalchemy,Sqlite,Sqlalchemy,我知道sqlite不支持返回,至少这是sqlAlchemy告诉我的: sqlalchemy.exc.CompileError: RETURNING is not supported by this dialect's statement compiler. 我在使用sqlAlchemy的核心库时遇到这个错误。下面是一个代码示例: from sqlalchemy.engine.url import URL from sqlalchemy import create_engine, MetaDat
sqlalchemy.exc.CompileError: RETURNING is not supported by this dialect's statement compiler.
我在使用sqlAlchemy的核心库时遇到这个错误。下面是一个代码示例:
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', Integer, 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, Integer, 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时,我没有看到。经过一些挖掘,我发现了这个 在本文档中,大容量插入映射的使用只是通过ORM“bulk”使用字典进行的批处理插入语句。。当设置
return\u defaults=True
时,我假设sqlalchemy反复调用最后一行id。因此,ID是可用的