繁体   English   中英

尝试插入字典列表时主键的空值

[英]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

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

firstnamelastnametext类型,没有默认值,没有约束。

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM