我很难让我的应用程序运行。每当我尝试在包中分离模块时,Flask-SQLAlchemy 扩展都会创建一个空数据库。为了更好地解释我在做什么,让我展示一下我的项目的结构:
Project
|
|-- Model
| |-- __init__.py
| |-- User.py
|
|-- Server
| |-- __init__.py
|
|-- API
| |-- __init__.py
这个想法很简单:我想为我的模型创建一个包,因为我不喜欢在单个包中传播代码,以及单独的“子”项目(如 API),因为将来我将使用蓝图更好隔离子应用。
代码非常简单:
首先,Model.__init__.py
:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
请注意,我创建它只是为了在整个包中使用单个SQLAlchemy()
对象。不,我们去 Model.User
from Model import db
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
Name = db.Column(db.String(80))
Age = db.Column(db.Integer)
...
再次注意我用来允许相同 db 对象的 from Model import db。
最后,Server.__init__.py
是这样的:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import Model, API
db = Model.db
def main():
app = Flask("__main__")
db = SQLAlchemy(app)
db.create_all()
API.SetAPIHookers(app)
app.run(host="0.0.0.0", port=5000, debug=True)
if __name__ == "__main__":
main()
从我的角度来看,这db = SQLAlchemy(app)
允许我在不创建循环引用的情况下传递我的应用程序对象。
问题是,每当我运行此代码时,sqlite 数据库文件都会被创建为空。这让我觉得也许 Python 并没有像我想象的那样导入东西。所以我通过删除导入模型并直接在服务器内部创建用户来测试我的理论......瞧,它奏效了!
现在我的问题来了:是否有一种“pythonic”的方式来正确分离我想要的模块,或者我应该把所有东西都放在同一个包中?