3

この環境を利用するのは初めてです。

私が使用したいと思っている SQLAlchemy の部分は、autoload = True で Table オブジェクトを使用してデータベースをクエリできるようにするものです。私のテーブルはすでにDB(mysqlサーバー)に存在し、フラスコモデルを定義して作成されていないため、これを行っています。

私はすべてのドキュメントを調べましたが、答えが見つからないようです。ここにいくつかのコードがあります:

app = Flask(__name__)
app.config.from_object(__name__)

metadata = None

def connect_db():
    engine = create_engine(app.config['DATABASE_URI'])
    global metadata
    metadata = MetaData(bind=engine)
    return engine.connect()


@app.before_request
def before_request():
    g.db = connect_db()


@app.teardown_request
def teardown_request(exception):
    g.db.close()

ここで、メタデータという名前のグローバル var を使用する理由を疑問に思われるかもしれません。さらにコードを追加します。

@app.route('/test/<int:id>')
def test(test_result_id):

    testTable = Table('test_table', metadata , autoload=True)

ご覧のとおり、関数内からアクセスするには、そのオブジェクトをグローバルにする必要があります。

また、必要な各関数で同じ var testTable を宣言しています。これは正しいアプローチではないと感じています。私のようなケースに対するベストプラクティスのアドバイスは見つかりませんでした。

皆さんありがとう!

4

1 に答える 1

3

SQLAlchemy ドキュメントでこのスニペットを見たことがありますか?

多分これはうまくいくでしょう:

# This is fine as a global global
metadata = MetaData()

@app.before_first_request
def autoload_tables():
    meta.reflect(bind=g.db.bind)

@app.route('/')
def index():
    users_table = meta.tables['users']

そうすれば、テーブルはプロセスごとに1回だけ反映されます。これはおそらくあなたが望むものです。エンジンもグローバルである必要があることに注意してください。そのため、@app.before_request で新しいエンジンを作成する必要はありません。アプリの作成は、より適切な場所です。

ケースが非常に特殊な場合は、リクエストごとに 1 つのエンジンが必要になることがあります。その場合は、ThreadLocalMetaDataクラスを検討する必要があります。

于 2012-12-10T06:43:03.867 に答える