我正在尝试使用Flask构建一个API。对于数据库操作,我使用flask_sqlalchemy。
在我的主文件中,flask应用程序是初始化的。我将结果实例传递给另一个设置了配置的文件和处理数据库操作的数据库模块。
main.py:
app = flask.Flask(__name__) # initialize flask app
#initialize modules with app
config.init(app)
database.init(app)
问题是,我在数据库中使用的关系在一个单独的文件中,它需要db对象来声明ORM的类。
我的想法是声明db并在init函数中初始化它,但在这种情况下不起作用,因为当pythonfile通过import加载时,db对象是未定义的。
relations.py
db: SQLAlchemy
def init(db):
Relations.db = db
class Series(db.Model):
"""Representation of a series
"""
id = db.Column(db.String(255), primary_key=True)
title = db.Column(db.String(255))
class User(db.Model):
"""Representation of a user
"""
id = db.Column(db.INT, primary_key=True)
name = db.Column(db.String(255))
class Subscription(db.Model):
"""Representation of a subscription
"""
series_id = db.Column(db.INT, primary_key=True)
user_id = db.Column(db.String(255), primary_key=True)
我的数据库模块使用的方式,它工作得很好(init. py文件):
db: SQLAlchemy
def init(app):
database.db = SQLAlchemy(app)
# handle database operations...
解决这个问题的一种方法是在relationships .py中使用另一个实例,如下所示:
app = flask.Flask(__name__)
db = SQLAlchemy(app)
# declare classes...
我试了一下,它工作,但这不是一个很好的方法来解决这个问题,并导致其他问题。由于循环导入,从main中导入它也不能工作。
我不知道如何在不移除模块化的情况下顺利解决这个问题。如有任何建议,我将不胜感激。如果我需要补充任何进一步的信息,请告诉我。
我会在main.py文件中创建app变量,但省略初始化部分。然后从init.py调用一个函数来基本设置数据库。
Main.py:
from init import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
Init.py:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
DB_NAME = "database.db"
def create_app():
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}'
db.init_app(app)
create_database(app)
#Other operations ...
return app
Relations.py
from init import db
#all your classes ...
db.create_all()
现在你可以把db对象从init.py导入到你的relationships .py文件中了。