私は最近、同じことを経験しましたが、2 つのデータベース間でモデルをリンクするという追加の課題がありました。
私は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()
アプリ名/モデル/モデル名.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)
...
run.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/
これに加えて、そこにディレクトリがあると思います。