python – 无法使用flask-sqlalchemy创建自动增量主键

我想要我的模型的主键是一个自动增量整数.这是我的模型的样子

class Region(db.Model):
    __tablename__ = 'regions'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(100))
    parent_id = db.Column(db.Integer, db.ForeignKey('regions.id'))
    parent = db.relationship('Region', remote_side=id, primaryjoin=('Region.parent_id==Region.id'), backref='sub-regions')
    created_at = db.Column(db.DateTime, default=db.func.now())
    deleted_at = db.Column(db.DateTime)

上面的代码创建了我的表,但不会使id自动增量.所以如果在我的插入查询我错过了id字段它给我这个错误ERROR:列“id”中的空值违反非空约束

所以我改变了id声明看起来像这样

id = db.Column(db.Integer, db.Sequence('seq_reg_id', start=1, increment=1), primary_key=True)

还是一样的错误.上面的代码有什么问题?

上面的代码没有什么问题.实际上,您甚至不需要autoincrement = True或db.Sequence(‘seq_reg_id’,start = 1,increment = 1),因为SQLAlchemy将自动设置未标记为FK的第一个Integer PK列为autoincrement = True .

在这里,我已经组建了一个基于你的工作设置.如果使用您定义的基于声明库的类创建对象的实例,SQLAlechemy的ORM将会使用它们来生成id和填充对象.

from flask import Flask                                                                                                                     
from flask.ext.sqlalchemy import SQLAlchemy                                                                                                 

app = Flask(__name__)                                                                                                                       
app.debug = True                                                                                                                            
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://user:password@localhost/testdb'                                                       
app.config['SQLALCHEMY_ECHO'] = True                                                                                                        
db = SQLAlchemy(app)                                                                                                                        

class Region(db.Model):                                                                                                                     
    __tablename__ = 'regions'                                                                                                               
    id = db.Column(db.Integer, primary_key=True)                                                                        
    name = db.Column(db.String(100))                                                                                                        

db.drop_all()                                                                                                                               
db.create_all()                                                                                                                             

region = Region(name='Over Yonder Thar')    
app.logger.info(region.id) # currently None, before persistence

db.session.add(region)                                                                                                                      
db.session.commit()                                                                                                                         
app.logger.info(region.id) # gets assigned an id of 1 after being persisted                                                                                                                

region2 = Region(name='Yet Another Up Yar')                                                                                                 
db.session.add(region2)                                                                                                                     
db.session.commit()                                                                                                                         
app.logger.info(region2.id) # and 2   

if __name__ == '__main__':                                                                                                                  
    app.run(port=9001)                                                                                                                      
翻译自:https://stackoverflow.com/questions/20848300/unable-to-create-autoincrementing-primary-key-with-flask-sqlalchemy

转载注明原文:python – 无法使用flask-sqlalchemy创建自动增量主键