flask 使用 sqlite

创建日期: 2023-02-03 17:32 | 作者: 风波 | 浏览次数: 16 | 分类: Flask

参考: - 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()
16 浏览
13 爬虫
0 评论