[英]null value for primary key when trying to insert list of dictionaries
我正在尝试通过一次调用进行大量插入,这里有人推荐的方式是给.insert
一个字典列表。 这是使用 SQLAlchemy 核心。
举个例子:
try:
engine = db.create_engine(f"postgres://user:pass@myip/addressbook", connect_args={'connect_timeout': 5})
connection = engine.connect()
metadata = db.MetaData()
except exc.OperationalError:
print_error(f":: Could not connect to myip!")
sys.exit()
table_addressbook = db.Table('addressbook', metadata, autoload=True, autoload_with=engine)
list = []
list.append({'firstname': "John", 'lastname': "Doe"})
list.append({'firstname': "Jane", 'lastname': "Doe"})
query = db.insert(table_addressbook).values(list)
connection.execute(query)
但是我收到一个错误,说列id
违反了非空约束。 这是因为 insert 通常会自动生成主键id
。 如何使用此方法但指定应自动生成id
? 或者我应该使用其他方法吗?
编辑
表名是addressbook
。
列id
是integer
类型,默认sequence
'untitled_table_id_seq',约束是PRIMARY_KEY
。 这是由 Postico for Mac 自动生成的,但我一直能够在不包含id
情况下插入,并且它会从最后插入的 ID 自动递增。
列firstname
和lastname
是text
类型,没有默认值,没有约束。
如果没有关于您的型号和/或连接的任何信息,回答您的问题有点困难。 请在下面找到一段使用insert
而不抛出非空约束错误的代码。 希望对你有帮助。
from sqlalchemy import create_engine, Column, Integer, String, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.sql import insert
engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
firstname = Column(String)
lastname = Column(String)
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
Session.configure(bind=engine) # once engine is available
session = Session()
new_users = []
new_users.append({'firstname': "John", 'lastname': "Doe"})
new_users.append({'firstname': "Jane", 'lastname': "Doe"})
i = insert(User).values(new_users)
session.execute(i)
PS:大部分来自教程: https : //docs.sqlalchemy.org/en/13/orm/tutorial.html
from sqlalchemy import Column
from sqlalchemy import create_engine
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
# Example Model definition for the illustration
class Customer(Base):
__tablename__ = "customer"
id = Column(Integer, primary_key=True)
name = Column(String(255))
description = Column(String(255))
Base.metadata.create_all(engine)
######################################################
# Bulk insert using dictionaries.
######################################################
# Insert test records into `customer`table.
def bulk_insert_customers(n):
session = Session(bind=engine)
session.bulk_insert_mappings(
Customer,
[
dict(
name="customer name %d" % i,
description="customer description %d" % i,
)
for i in range(n)
],
)
session.commit()
有关如何以不同方式进行批量插入的更多示例,请参阅这些示例: https : //docs.sqlalchemy.org/en/13/_modules/examples/performance/bulk_inserts.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.