[python] どのように既存のデータベースの周りにフラスコアプリケーションを構築するには?



Answers

フラスコのコンテキストにHolgerの答えを接続する鍵は、 db.ModelBaseようなdeclarative_base的なBaseオブジェクトであることです。 flask-sqlalchemyのdocumentationでこの重要な文に気付くまでしばらく時間がかかりました

以下は私のアプリに使用した手順です:

  1. 通常のフラスコ - 錬金術の方法でdbオブジェクトを開始します: db = SQLAlchemy(app) 。 注意するには、前にapp.config['SQLALCHEMY_DATABASE_URI'] = 'connection_string'を設定する必要があります。

  2. 宣言ベースをエンジンにバインドする: db.Model.metadata.reflect(db.engine)

  3. 次に、既存のテーブルを簡単に使用することができます(例えば、私はBUILDINGSというテーブルを持っています):

    class Buildings(db.Model):
        __table__ = db.Model.metadata.tables['BUILDING']
    
        def __repr__(self):
            return self.DISTRICT
    

これで、 Buildingsクラスが既存のスキーマに従います。 Pythonシェルでdir(Buildings)試して、すでにリストされているすべての列を見ることができます。

Question

私はすでにMySQL多くのテーブルと多数のデータを持っている既存のデータベースを持っていMySQL 。 私はFlaskアプリケーションを作成し、それと一緒にsqlalchemyを使用するつもりです。 今私はircで尋ねて、Googleを見回し、次のアイデアを試しました:

最初に私はsqlacodegenを使用して私のDBからモデルを生成しました。 しかし、私はそれについてちょっと混乱して、もう少し見ました。 そして私はthisを見つけthis

これは洗練されたソリューションのように見えました。

だから、私はそこにある解決策にしたがって私のmodels.pyを書き直しました、そして今私はさらに混乱しています。 私は、既存のDBと一緒にこのフラスコアプリを構築するための最良のアプローチを探しています。

私はフラスコのドキュメントを見ましたが、実際には既存のdbを持つプロジェクトのための助けを得ていませんでした。 何かを最初から作成し、dbとallを作成するには、多くの良いものがあります。 しかし、私は本当に混乱しています。

Flaskでの私の最初の日に注意してください。しかし、私はDjangoでの経験があるので、基本的なコンセプトはハードルではありません。 私はこのユースケースのための最良のアプローチを選択する際にいくつかのガイダンスが必要です。 詳細な説明は非常に高く評価されます。 詳細では、誰かがすべてのコードを書いて、スプーンでこれをフィードしてくれるとは思っていませんが、私を始めるのに十分です。これはsqlalchemyを介してflaskシームレスにこのdbを統合しsqlalchemy 。 私のDBはMySQL注意してください。




これは、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)



私はsqlalchemyで既存のデータベースを使用する最も簡単な方法は、 AutomapBaseクラスを使用することだと思います。 docsのサンプルコードは次のとおりです。

from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session
from sqlalchemy import create_engine

Base = automap_base()

# engine, suppose it has two tables 'user' and 'address' set up
engine = create_engine("sqlite:///mydatabase.db")

# reflect the tables
Base.prepare(engine, reflect=True)

# mapped classes are now created with names by default
# matching that of the table name.
User = Base.classes.user
Address = Base.classes.address

session = Session(engine)

# rudimentary relationships are produced
session.add(Address(email_address="foo@bar.com", user=User(name="foo")))
session.commit()

# collection-based relationships are by default named
# "<classname>_collection"
print (u1.address_collection)

詳細およびより複雑な使用法については、 SqlAlchemy-Automapを参照してください。







Related