web-dev-qa-db-ja.com

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フィールドを見逃すと、このエラーが発生します

エラー:列「id」のヌル値が非ヌル制約に違反しています

id宣言を次のように変更しました

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

それでも同じエラー。上記のコードの何が問題になっていますか?

33
lovesh

上記のコードに問題はありません。実際、SQLAlchemyは_autoincrement=True_としてFKとしてマークされていない最初のInteger PK列を自動的に設定するため、_autoincrement=True_またはdb.Sequence('seq_reg_id', start=1, increment=1),も必要ありません。

ここでは、あなたの設定に基づいて作業セットアップをまとめました。 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)
_
31
nothankyou

設定したら自動インクリメントは必要ないと思いますが、

id = db.Column(db.Integer , primary_key=True , autoincrement=True)

私はそれがあるべきだと思う、

id = db.Column(db.Integer , primary_key=True)

それはあなたが探している独自性を与えるでしょう。

0
MUGABA