2017-04-17 19 views
1

私はフラスコとsqlalchemyでファンシーのための基本的なAPIを作っています。私はsqlalchemyのドキュメントで、接続文字列を持つエンジンを1つだけ持つべきであることを読んでいます。それはアプリ内でどのように構造化されるはずです> __init__.pyファイルですか?フラスコサーバーを起動するために実行されるフラスコファイルですか?ここに私のgithubのレポがあります。なぜなら、現在のアプリの構造とそれが持つ可能性のある欠陥を簡単に見ることができるからです。 https://github.com/JayHelton/Geekdom_Web_Appフラスコでの適切なsqlalchemyの使用

私のクエリメソッドでは、毎回新しいDBエンジンを作成していますが、動作しているようですが、複数の人がこれらのメソッドを呼び出そうとすると問題に遭遇したくありません。ありがとうございました!

+2

http://flask-sqlalchemy.pocoo.org/ – davidism

答えて

2

をすでにありますフラスコxtension Flask-SQLAlchemy - FlaskドキュメントSQLAlchemy in Flaskにも記載されています。しかし、ほとんどのFlaskエクステンションのように、FlaskとSQLAlchemy(または他のライブラリ)を一緒に「配管」するだけです。最良のドキュメントは、しばしば、ソースコードです:)

github.com/mitsuhiko/flask-sqlalchemy/blob/master/flask_sqlalchemy/__init__.py

しかし、フラスコSQLAlchemyの場合には、それは多くのコードであり、また、フラスココンテキストと変更の追跡と絡み合っスコープのセッションについていくつかの黒魔術とWebアプリケーションや、すべての可能なコーナーケースやその他いくつかの点で便利なものがいくつかあります。私はそれが少し強調されていると思います。私はではありませんあなたはそれを使用すべきではないと言っています - ちょうどSQLAlchemyとFlaskの間の接続は、より多くの読書時間がかかるかもしれないので、拡張コードから最初の目に見えません。

しかし、あなたはそれを自分で行いたい場合には(まあ、SQLAlchemyのが得ることができるよう簡単など)は非常に簡単です - ちょうど「あなたがsessionmakerを得るように、SQLAlchemyのを初期化し、各要求の前にセッションを作成し、その後、ドン要求の後にそれを閉じることを忘れてください:)そしてFlaskハンドラでこのセッションを使用してください(私は@app.route関数を意味します)。

import flask 
import sqlalchemy 
from sqlalchemy import Column, Integer, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 

Base = declarative_base() 

class Item (Base): 

    __tablename__ = 'items' 

    id = Column(Integer, primary_key=True) 
    title = Column(String)  

engine = sqlalchemy.create_engine('sqlite:///bestappever.db', echo=True) 
Session = sessionmaker(bind=engine) 

# create all tables if you wish... 
Base.metadata.create_all(engine) 

app = flask.Flask(__name__) 

@app.before_request 
def create_session(): 
    flask.g.session = Session() 

@app.teardown_appcontext 
def shutdown_session(response_or_exc): 
    flask.g.session.commit() 
    flask.g.session.remove() 

@app.route('/') 
    # just use the SQLAlchemy session :) 
    items = flask.g.session.query(Item).all() 
    return flask.render_template('index.html', items=items) 

私の例フラスコ+ SQLAlchemyのアプリを参照してください:あなたはあなたも一つの大きなファイル上のすべてのものを持っていますが(通常はmodel.pyのように命名された1)複数のファイルにそれを分割することができます見ての通りhttps://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py

を されますベストプラクティス

最も重要なことは、個々の要求の間孤立セッション持つことである - 私の溶液中のセッションがbefore_requestフックで要求ごとに作成されます。 Flask docs "SQLAlchemy in Flask"の解決策は、基本的に同じ効果を持つscoped_sessionを使用します(各スレッドごとに1つの別々のセッションでスレッドローカル変数を使用して実現)。

広告アプリケーションのアーキテクチャ:より大きなアプリケーションでは、Larger Applications patternsblueprintsを使用するとよいでしょう。私のフラスコのルートハンドラはすべて青写真になります。そして、私は1つの "main"関数を持っています。get_app() 1)Flaskオブジェクトを作成します。2)青写真を登録します。3)SQLAlchemyエンジンを作成し、フラスコでフックします。おおよそthisまたはthisに似ています。


あなたは今までつのエンジンを持っている必要があり

なぜ?技術的には、エンジンはデータベースとの接続(プール)に過ぎません。あなたのアプリが3つの別々のデータベースを使用している場合、もちろん、3つのエンジンが必要です。

もちろん、セッションはちょうど1つのエンジンに接続されています。したがって、複数のセッションが必要になります。そして、あなたのモデルクラスのための複数の宣言的な基底、そして - 最も重要なのは - それを誤って混ぜ合わせないことです。だから可能ならば、ただ1つのエンジンを持つことをお勧めします。

リクエストごとにエンジンを作成できます。これは技術的には正しいものの、非効率的です。アプリケーション全体に対して1つのエンジンを保持し、要求ごとにセッションを作成するだけです。

0

FlaskアプリケーションにSQLAlchemyをインストールしたら、別の* .pyファイルを作成してデータベース設定を保存し、import文を使用して他の.pyファイルに組み込んで使用する必要があります。

APIデータのテーブルをアプリ内で表示/作成する場合は、db接続文字列もインポートする 'models.py'ファイルのようなものになります。

ここではFlask + SQLAlchemy todoアプリのチュートリアルがありますが、ここではファイル構造とdb実装について詳しく説明しています。以下は

http://www.vertabelo.com/blog/technical-articles/web-app-development-with-flask-sqlalchemy-bootstrap-part-2

しかしまた、ウォークスルーフラスコとSQLAlchemyのDBをセットアップについての詳細な、ともORMを使用してのいくつかの例を乗り越え、より汎用的なビットとのリンクは、照会ではなく、生のSQLクエリ(されます私は一般的に、生のSQLクエリを使用していますが - 私は通常、MySQLの&をインストールすることを与えられた)しかし、これは単なるAPIデータを使用して、アプリは過剰であってもよいし、MySQLのワークベンチでテーブルを作成します。もちろん

http://flask.pocoo.org/docs/0.12/patterns/sqlalchemy/