1. ホーム
  2. python

既にあるデータベースを中心にflaskアプリケーションを構築するには?

2023-08-01 12:39:42

質問

私はすでに、多くのテーブルと多くのデータを持つ既存のデータベースを持っています。 MySQL . 私は Flask アプリを作り、それと一緒にsqlalchemyを使うつもりです。さて、ircで聞いてみたり、googleで調べてみたりして、以下のようなアイデアを試してみました。

まず 私は sqlacodegen からモデルを生成するために DB . しかし、その後、私はそれについて少し混乱して、もう少し見てみました。そして、私は見つけた この .

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

そこで 第二 を書き直しました。 models.py そこにある解決策に従って、今私はさらに混乱しています。私はすでに存在するDBと一緒にこのFLASKアプリを構築するための最良のアプローチを探しています。

私はflaskのドキュメントを調べましたが、すでに存在するDBを持つプロジェクトのためのどんな助けも得られなかったのです。ゼロから何かを作成するための多くの良いものがあり、DBとすべてを作成します。しかし、私は本当に混乱しています。

を使った最初の日であることに注意してください。 Flask を使うのは初めてですが、私は Django の経験があるので、基本的なコンセプトはハードルではありません。このユースケースに最適なアプローチを選択するために、いくつかのガイダンスが必要です。詳細な説明があれば、非常にありがたいです。詳細な説明というのは、誰かがすべてのコードを書いて、これについて私に匙を投げてくれることを期待しているわけではありません。 flask を経由して sqlalchemy . 私の DB は MySQL .

どのように解決するのですか?

あなたの質問は、flaskとは全く関係ないと言えるでしょう。例えば、テンプレート、ルート、ビュー、ログオンデコレータに問題があるわけではありません。

あなたが苦労しているのは、SQLAlchemyのところです。

そこで提案なのですが、しばらくはFlaskを無視して、まずはSQLAlchemyに慣れることです。既存のデータベースと、SQLAlchemy からどのようにアクセスするかに慣れる必要があります。MySQL のドキュメントツールを使って、自分のやり方を探してみてください。まずはこんな感じです(Flask とは全く関係ないことに注意してください ...まだ)。

#!/usr/bin/python
# -*- mode: python -*-

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///webmgmt.db', convert_unicode=True, echo=False)
Base = declarative_base()
Base.metadata.reflect(engine)


from sqlalchemy.orm import relationship, backref

class Users(Base):
    __table__ = Base.metadata.tables['users']


if __name__ == '__main__':
    from sqlalchemy.orm import scoped_session, sessionmaker, Query
    db_session = scoped_session(sessionmaker(bind=engine))
    for item in db_session.query(Users.id, Users.name):
        print item

行の中の" engine = という行で、SQLAlchemy が MySQL データベースを見つけられるように、MySQL データベースのパスを指定する必要があります。私の場合、既存の sqlite3 データベースを使いました。

行の中の " class Users(Base) という行では、MySQLデータベースの既存のテーブルのいずれかを使用する必要があります。私のsqlite3データベースには、"users"という名前のテーブルがあることは知っていました。

この時点で、SQLalchemy は MySQL データベースに接続する方法を知り、テーブルの1つについて も知っています。次に、他のすべてのテーブルを追加する必要があります。最後に、SQLalchemy とのリレーションを指定する必要があります。ここでいうリレーションとは、1対1、1対多、多対多、親子、などといったものです。SQLAlchemy の Web サイトには、これに関するかなり長いセクションがあります。

行の後、" if __name__ == '__main__' という行の後に、いくつかのテストコードがあります。これは、私がpythonスクリプトをインポートしない場合、実行されますが、実行されます。ここでは、私はDBセッションを作成し、非常に単純なクエリのためにそれをされていることがわかります。

私の提案は、まず SQLAlchemy のドキュメントの重要な部分、例えば記述的なテーブル定義、リレーションシップモデル、そしてクエリの方法について読んでみることです。一度これを知れば、私の例の最後の部分を、コントローラとして変更することができます(例えば Python の yield メソッドを使って)コントローラに変更し、そのコントローラを使用するビューを書きます。