参考: - https://stackoverflow.com/questions/73999854/flask-error-runtimeerror-working-outside-of-application-context - https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/ - https://stackoverflow.com/questions/34009296/using-sqlalchemy-session-from-flask-raises-sqlite-objects-created-in-a-thread-c
Flask 处理请求的方式是多线程的,如果直接使用 SQLAlchemy
创建数据库连接,那么需要自己为每个线程都创建自己的 session ,不然会报错:
sqlalchemy flask SQLite objects created in a thread can only be used in that same thread 。
但是,如果自己来维护每个线程的 session 又太费劲,所以可以使用 flask_sqlalchemy
来创建数据。
需要注意的一点是,sqlite 的数据库文件必须是绝对路径,不然 flask 会自动到当前目录下的 instance
目录去创建数据库文件。
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
dbfile = 'sqlite:///' + os.path.join(os.path.abspath(os.path.dirname(__file__)), 'hello.db')
app.config['SQLALCHEMY_DATABASE_URI'] = dbfile
db = SQLAlchemy(app)
class Urls(db.Model):
__tablename__ = "urls"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
pid = db.Column(db.Integer, default=None, nullable=True)
title = db.Column(db.String(512))
url = db.Column(db.String(1024), nullable=False, unique=True)
size = db.Column(db.Integer)
addtime = db.Column(db.DateTime(), default=datetime.datetime.now, nullable=False)
updatetime = db.Column(db.DateTime(), default=datetime.datetime.now, onupdate=datetime.datetime.now, nullable=False)
with app.app_context():
db.create_all()
urlid = 10000
urlobj = db.session.query(Urls).filter(Urls.id == urlid).first()