我想在我的数据库(Oracle 11g,但是Ubuntu 16.04的Express Edition)中使用带有SQLAlchemy模块的Python和Flask框架创建一个新表。表和ID的第一个字段是Integer字段,我希望它自动增量,但Oracle数据库不支持自动增量。我有一个表单来添加新评论,但是当我尝试添加新记录时,它会报告错误:
sqlalchemy.exc.IntegrityError:(cx_Oracle.IntegrityError)ORA-01400:无法插入NULL(“WIKTOR”。“TBL_COMENTARIOS”。“ID”)[SQL:'INSERT INTO tbl_comentarios(usuario,comentario,fecha)VALUES (:usuario,:comentario,:fecha)返回tbl_comentarios.id INTO:ret_0'] [参数:{'usuario':'wiktor','comentario':'hola','fecha':datetime.datetime(2017,5 ,24,11,23,45,39450),'ret_0':}]
基本上它说ID不能为null,这是因为表单中没有字段要添加它,所以它将id发送为空,然后数据库模型的自动增量不起作用。这是代码:
db = SQLAlchemy()
class Comentarios(db.Model):
__tablename__ = 'tbl_comentarios'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
usuario = db.Column(db.String(50))
comentario = db.Column(db.Text())
fecha = db.Column(db.DateTime, default = datetime.datetime.now)
def __init__(self, usuario, comentario):
self.usuario = usuario
self.comentario = comentario
我也尝试过:
id = db.Column(db.Integer, primary_key=True)
该代码在SQL数据库中有效,但在Oracle数据库中均无效。
对不起我的英语,我希望有人可以帮助我...... 谢谢!
答案 0 :(得分:2)
您可以找到here讨论此问题的SQLAlchemy文档。 Oracle没有自动增量功能,依赖于序列来模仿行为。
因此,您的id列应如下所示:
id_seq = Sequence('id_seq')
id = db.Column(db.Integer, id_seq,
server_default=id_seq.next_value(), primary_key=True)