python - 尝试插入字典列表时主键的空值
问题描述
我正在尝试通过一次调用进行大量插入,这里有人推荐的方式是提供.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
是 type 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
推荐阅读
- java - 使用 Lombock 和构造函数注入 Spring 注入的 bean 为空
- aframe - aFrame Mobile,留在 VR 中?
- regex - 正则表达式在单词之前查找日期
- javascript - 有没有办法在图片到图片模式下打开 HTML 卡(适用于 PC)
- python - 当它在python中不起作用时如何修复'replace'关键字
- javascript - 赛普拉斯期望字符串包含一个元素或另一个元素
- ionic-framework - Stencil.js 渲染插槽内容,如果 render() 返回 null 则事件
- excel - 在 VBA 中创建具有多个系列的散点图
- mysql - 如何在 MySQL 中将 multer 文件作为 blob 上传?
- python - Python应用程序未加载图形