Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy需要由程序生成主键_Python_Sql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

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)