Flask SQLAlchemy重启后无法读取数据库条目,其他文件可正常读取
问题排查提示
1. 优先验证数据库文件路径一致性
这是最常见的原因:两个文件运行时的工作目录不同,导致连接到了不同的SQLite数据库文件。
在app.py和第二个文件中分别添加代码打印数据库文件的绝对路径,确认是否指向同一个文件:
- 在
app.py中添加:import os with app.app_context(): print("App 连接的DB路径:", os.path.abspath('myDB.db')) - 在第二个文件中添加:
import os print("第二个文件连接的DB路径:", os.path.abspath('myDB.db'))
如果路径不一致,说明运行app.py时的工作目录不是文件所在的文件夹。解决方法:
- 将
SQLALCHEMY_DATABASE_URI改为绝对路径,例如:sqlite:////Users/xxx/project/myDB.db(Windows系统用sqlite:///C:/xxx/project/myDB.db) - 调整VSCode的运行配置,确保工作目录为项目文件夹
2. 修正模型和DB实例的定义范围
当前app.py中db = SQLAlchemy(app)和Recipy类是在with app.app_context():块内定义的,可能导致上下文绑定异常。建议将DB实例和模型移到全局范围,仅在上下文内执行create_all():
修改后的app.py核心代码:
app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myDB.db' app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False app.config["SQLALCHEMY_ECHO"] = "debug" # 全局定义DB实例和模型 db = SQLAlchemy(app) class Recipy(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100), index=True, unique=True) # 其他字段... # 在上下文内初始化表 with app.app_context(): db.create_all() @app.route('/') def index(): rows = Recipy.query.all() print(rows) return render_template("home.html", rows=rows, search_form=search_form)
3. 排除表结构或事务异常
- 检查
app.py中是否存在db.drop_all()代码(即使注释掉也可能残留执行记录),避免启动时意外清空表 - 从日志看,两次查询后都执行了
ROLLBACK,这是SQLAlchemy查询事务的默认行为,不会影响数据读取,无需关注
内容的提问来源于stack exchange,提问作者Sergii
相关产品推荐
相关产品推荐

