烧瓶sqlalchemy.exc.InvalidRequestError:

时间:2019-10-08 17:56:40

标签: python flask

我是Flask的新手,正在尝试将用户添加到我的数据库中。一切工作正常,但是(也许,也许不是)升级数据库时,我现在收到以下错误消息

sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a 
previous exception during flush. To begin a new transaction with this Session, first issue 
Session.rollback(). Original exception was: (sqlite3.OperationalError) no such table: users

有人知道我可以从这里做什么吗?

这是我的模型。py:

from server import db
from sqlalchemy.dialects.postgresql import JSON
from datetime import datetime


class User(db.Model):
    __tablename__ = 'users'
    __table_args__ = {'extend_existing': True} 

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    email = db.Column(db.String(64), unique=True, index=True)

我的server.py

from flask import Flask, request, abort, jsonify, redirect, url_for, flash, render_template, 
session, g
from flask_sqlalchemy import SQLAlchemy
import os
#from models import db

app = Flask(__name__)
#app.config.from_object(os.environ['APP_SETTINGS'])
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)

@app.route("/")
def hello():
    return "Welcome!!!"

我的manage.py

import os
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

from server import app, db


#app.config.from_object(os.environ['APP_SETTINGS'])

migrate = Migrate(app, db)
manager = Manager(app)

manager.add_command('db', MigrateCommand)


if __name__ == '__main__':
    manager.run()

我在顶部有一个config.py文件,但我认为它与这里无关。

例如,当我在终端中输入“ python manage.py shell”并且执行类似操作

from models import User, db
db.create_all()
user_susan = User(username='susan', email='susan@hotmail.com')
db.session.add(user_susan)
db.session()

这是错误消息填充的时间,它在...之前没有出现过,将不胜感激。

2 个答案:

答案 0 :(得分:0)

如错误消息所述:您的数据库上一次提交存在错误(例如:用户已存在导致“唯一约束失败”。

SqlAlchemy建议处理失败的提交:

try:
    <use session>
    session.commit()
except:
   session.rollback()
   raise <-- you can inspect your root error, if you log/print this exception
finally:
   session.close()  # optional, depends on use case

答案 1 :(得分:0)

检查您之前捕获了来自 sqlalchemy.exc 的哪些异常。较新版本的 sqlalchemy 可能会抛出与早期版本不同的命名异常。

我最近不得不从捕捉 sqlalchemy.exc.DatabaseError 切换到捕捉 sqlalchemy.exc.InvalidRequestError