我最近经历了同样的事情,但面临着将模型链接到两个数据库的额外挑战。
我使用了Flask-SQLAlchemy,我所要做的就是以与我的数据库表相同的方式定义我的模型。我发现困难的是弄清楚我的项目结构应该是什么样子。
我的项目是一个 Restful API,这就是我最终得到的结果:
conf/
__init__.py
local.py
dev.py
stage.py
live.py
deploy/
#nginx, uwsgi config, etc
middleware/
authentication.py
app_name/
blueprints/
__init__.py
model_name.py #routes for model_name
...
models/
__init.py
model_name.py
__init__.py
database.py
tests/
unit/
test_etc.py
...
run.py
注意文件:
conf/xxx.py
这就是我们告诉 Flask-SQLAlchemy 连接什么的方式,此外,您可以在此处放置任何其他配置项(如日志位置、调试配置等)。
SQLALCHEMY_DATABASE_URI = 'mysql://username:password@host:port/db_name'
app_name/__init__.py
这是我创建我的应用程序并初始化数据库的地方。这个 db 对象将被导入并在整个应用程序中使用(即,在模型、测试等中)。我还设置了我的记录器,初始化我的 API 和蓝图,并在此处附加我的中间件(未显示)。
from app_name.database import db
from flask import Flask
def create_app(*args, **kwargs):
env = kwargs['env']
app = Flask(__name__)
app.config.from_object('conf.%s' % env)
db.init_app(app)
return app
app_name/database.py
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
app_name/models/model_name.py
from services.database import db
class Bar(db.Model):
__tablename__ = 'your_MySQL_table_name'
id = db.Column('YourMySQLColumnName', db.Integer, primary_key=True)
name = db.Column('WhateverName', db.String(100))
foo = db.Column(db.ForeignKey('another_MySQLTableName.id'))
class Foo(db.Model):
__tablename__ = 'another_MySQLTableName'
id = db.Column('FooId', db.Integer, primary_key=True)
...
运行.py
#! /usr/bin/env python
from app_name import create_app
app = create_app(env='local')
if __name__ == '__main__':
app.run()
我曾经run.py
在本地运行应用程序,但我使用 nginx + uWSGI 在 dev/stage/live 环境中运行应用程序。
我猜你views/
除了这个之外还有一个目录。