Python SQLAlchemy需要由程序生成主键
定义表时,将一列定义为Python SQLAlchemy需要由程序生成主键,python,sql,sqlalchemy,flask-sqlalchemy,Python,Sql,Sqlalchemy,Flask Sqlalchemy,定义表时,将一列定义为primary\u key=True。如中所示,SQLAlchemy将自动为项目创建ID,即使用户未提供该ID。主键=True也会自动设置nullable=False 是否有一种方法可以设置主键,使其成为必需的,但不由SQLAlchemy填充?我希望我的程序必须为每一行提供一个主键 比如: class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True, aut
primary\u key=True
。如中所示,SQLAlchemy将自动为项目创建ID,即使用户未提供该ID。主键=True
也会自动设置nullable=False
是否有一种方法可以设置主键,使其成为必需的,但不由SQLAlchemy填充?我希望我的程序必须为每一行提供一个主键
比如:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, autogenerate=False)
name = Column(String)
nickname = Column(String)
您可以将属性设置为False
,以获得此效果*。此代码
将sqlalchemy作为sa导入
meta=sa.MetaData()
tbl=sa.表('test20210102a',元,
sa.Column('id',sa.Integer,primary_key=True,autoincrement=False),
sa.Column('name',sa.String(8)))
engine=sa.create_引擎('postgresql+psycopg2:///test',echo=True)
meta.drop_all(绑定=引擎)
meta.create_all(绑定=引擎)
使用engine.connect()作为连接:
conn.execute(tbl.insert({'name':'foo'}))
处理引擎
创建表时发出此警告
SAWarning:列“test20210102a.id”被标记为表“test20210102a”的主键的成员,但未指示Python端或服务器端默认生成器,也未指示“autoincrement=True”或“nullable=True”,并且未传递显式值。主键列通常不能存储NULL。
并产生这个错误
sqlalchemy.exc.IntegrityError:(psycopg2.errors.NotNullViolation)列“id”中的null值违反了非null约束
详细信息:失败的行包含(null,foo)。
*以上代码应该适用于大多数RDBMS。Sqlite具有不同的自动增量语义,如中所述,但您可以通过为id列使用不同的整数类型来获得类似的行为:
sa.Column('id',sa.SmallInteger,主键=True,自动递增=False)