Flask中使用SQLAlchemy时instance文件夹自动生成导致原project.db失效的问题求助
Flask中使用SQLAlchemy时instance文件夹自动生成导致原project.db失效的问题求助
嘿,这个问题其实是Flask的instance文件夹机制在搞鬼,很多新手都会碰到,别担心,我给你讲清楚原因和解决办法:
为什么会自动生成instance文件夹?
Flask默认会创建一个instance文件夹,用来存放和当前应用实例绑定的、不适合放到代码仓库里的敏感/实例专属数据(比如数据库文件、密钥配置)。你配置的"sqlite:///project.db"是相对路径,SQLAlchemy默认会把这个路径解析到Flask的instance目录下,而不是你项目的根目录,所以才会在instance里生成新的project.db,你自己在根目录创建的那个自然就没用了。
两种解决办法任你选:
方法1:修改数据库路径,指向你根目录的project.db
你可以通过拼接项目根目录的绝对路径来指定数据库位置,这样就能用你原来创建的project.db了。修改你的配置代码:
import os from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() app = Flask(__name__) # 拼接项目根目录下的project.db路径 db_path = os.path.join(os.path.dirname(__file__), 'project.db') app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{db_path}" db.init_app(app) # 注意模型类的属性要缩进,不然会报错哦 class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String, unique=True, nullable=False) email = db.Column(db.String) with app.app_context(): db.create_all()
这样运行后,SQLAlchemy就会直接使用你根目录下的project.db,不会再生成instance里的文件了。
方法2:把现有project.db移到instance文件夹里
如果你不想改代码,也可以直接把你根目录的project.db移动到自动生成的instance文件夹里。这样Flask和SQLAlchemy就会自动读取这个数据库文件,你的原有数据也能保留,后续操作也都会基于这个文件。
补充说明
很多教程没提到这个点,要么是因为用了旧版本的Flask/SQLAlchemy,要么是默认遵循了instance目录的规范。其实Flask推荐把数据库这类实例数据放在instance文件夹里,这样能避免把敏感数据不小心提交到代码仓库里,如果你没有特殊需求,方法2其实更符合Flask的设计规范哦~
备注:内容来源于stack exchange,提问作者Ces
相关产品推荐
相关产品推荐

