首页 > 解决方案 > 尝试插入字典列表时主键的空值

问题描述

我正在尝试通过一次调用进行大量插入,这里有人推荐的方式是提供.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

idinteger具有默认sequence'untitled_table_id_seq' 的类型,约束是PRIMARY_KEY. 这是由 Postico for Mac 自动生成的,但我一直能够在不包含的情况下插入,id并且它会从最后插入的 ID 自动递增。

firstnamelastname是 type text,没有默认值,没有约束。

标签: pythonsqlalchemy

解决方案


如果没有关于您的型号和/或连接的任何信息,回答您的问题有点困难。请在下面找到一段代码,该代码使用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


推荐阅读