79

に多数のテーブルと大量のデータを含む既存のデータベースが既にありますMySQLFlaskアプリを作成し、それと一緒に sqlalchemy を使用するつもりです。今、私はircに質問し、Googleで調べて、次のアイデアを試しました:

最初にsqlacodegenを使用して、 からモデルを生成しましたDB。しかし、私はそれについて少し混乱し、もう少し調べました。そして、これを見つけまし

これはエレガントなソリューションのように見えました。

第二に、私はそこでの解決策に従って自分を書き直しmodels.pyましたが、今ではさらに混乱しています。既存の DB と共にこのフラスコ アプリを構築するための最良の方法を探しています。

フラスコのドキュメントを調べましたが、既存のデータベースを使用したプロジェクトのヘルプは実際には得られませんでした。何かをゼロから作成したり、データベースを作成したりするための優れた機能がたくさんあります。しかし、私は本当に混乱しています。

との初日Flaskですが、私は の経験がDjangoあるので、基本的な概念はハードルではありません。このユースケースに最適なアプローチを選択するためのガイダンスが必要です。詳細な説明をいただければ幸いです。詳細に言えば、誰かがすべてのコードを書いてスプーンでこれを教えてくれるとは絶対に期待していませんが、始めるには十分flaskですsqlalchemy。私のDBがにあることに注意してくださいMySQL

4

10 に答える 10

22

私は最近、同じことを経験しましたが、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/これに加えて、そこにディレクトリがあると思います。

于 2013-07-15T14:40:26.423 に答える
6

自動生成を使用しようとしましたが、何も機能しないか、実行できませんでした。sqlacodegen を使用して生成コードを検索すると、https://github.com/ksindi/flask-sqlacodegenが見つかります。コードを生成するだけです

flask-sqlacodegen  mysql://username:password@host:port/db_name --schema yourschema --tables table1,table2 --flask

私は試してみましたが、完璧に動作します

于 2016-11-17T07:55:26.967 に答える
2

これは、Holger の回答で説明されているエンジン パスを設定する別の方法です。ユーザー名またはパスワードに特殊文字が含まれている場合に便利です。

from sqlalchemy.engine.url import URL
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

engine_URL = URL('mssql+pymssql',
                 username='DOMAIN\\USERNAME', 
                 password="""p@ssword'!""", 
                 host='host.com', 
                 database='database_name')

engine = create_engine(engine_URL)
Base = declarative_base()
Base.metadata.reflect(engine)
于 2015-03-21T02:32:49.993 に答える