使用sqlite大容量插入和返回ID

使用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

我知道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, 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是可用的