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)