without update postgres example python postgresql sqlalchemy flask flask-sqlalchemy

update - python flask orm postgresql



no se puede crear la clave primaria de autoincremento con flask-sqlalchemy (2)

Quiero que la clave principal de mi modelo sea un entero de autoincremento. Así es como se ve mi modelo

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)

El código anterior crea mi tabla pero no realiza el autoincremento de id . Así que si en mi consulta de inserción pierdo el campo de id me da este error

ERROR: el valor nulo en la columna "id" viola la restricción no nula

Así que cambié la declaración de id para tener este aspecto

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

Sigue siendo el mismo error. ¿Qué está mal con el código de arriba?


Estaba teniendo el mismo problema, usando flask-sqlalchemy y postgresql. Pude resolverlo cambiando la columna de identificación a la siguiente:

id = db.Column(db.Integer, primary_key=True, default=lambda: uuid.uuid4().hex)


Nada está mal con el código anterior. De hecho, ni siquiera necesita autoincrement=True o db.Sequence(''seq_reg_id'', start=1, increment=1), ya que SQLAlchemy establecerá automáticamente la primera columna PK de Integer que no está marcada como FK como autoincrement=True .

Aquí, he reunido una configuración de trabajo basada en la suya. El ORM de SQLAlechemy se encargará de generar identificadores y rellenar objetos con ellos si utiliza la clase basada en Declarative Base que ha definido para crear instancias de su objeto.

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)