2017-04-17 112 views
1

我正在用燒瓶和sqlalchemy製作燃燒器的基本API。我在sqlalchemy文檔中讀到,你應該只有一個引擎連接字符串。這應該如何構建在應用程序> __init__.py文件中?在啓動燒瓶服務器的燒瓶文件中?這裏是我的github回購,因爲我認爲它更容易看到當前的應用程序結構和它可能存在的任何缺陷。 https://github.com/JayHelton/Geekdom_Web_App適當的sqlalchemy在燒瓶中使用

在我的查詢方法,我每次創建一個新的數據庫引擎,它似乎工作,但我不想遇到問題,如果多人嘗試調用這些方法。謝謝!

+2

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

回答

2

當然已經有一個燒瓶e xtension Flask-SQLAlchemy - 也在Flask文檔SQLAlchemy in Flask中提到。但是像大多數Flask擴展一樣,它所做的只是將一些「管道」Flask和SQLAlchemy(或任何其他庫)集中在一起。最好的文檔往往是時代的源代碼:)

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

然而,在燒瓶SQLAlchemy中的情況下,大量的代碼,並與有關瓶的背景和修改跟蹤和交織範圍的會議一些黑魔法持續時間調試以及一些在網絡應用和所有可能的角落案例和其他一些事情中有用的東西。我會說這有點過分。我是而不是,表示你不應該使用它 - 只是從擴展代碼首先看SQLAlchemy和Flask之間的連接是不可見的,所以它可能需要更多的閱讀時間。

但是,如果你想自己做這很容易(當然,如容易爲SQLAlchemy中可以得到) - 只需初始化SQLAlchemy的,所以你得到一個sessionmaker,然後創建每個請求之前的會話,然後穿上」不要忘記在請求後關閉它),並在你的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的應用:https://github.com/messa/db-workshop-web-app/blob/sqlalchemy/anketa.py

正如你看到的,你甚至可以有一個大文件的一切,但它分裂成多個文件(其中一個通常命名爲像model.py) 是最佳做法。

最重要的是有個別請求之間的隔離會話 - 在我的解決方案中,爲before_request鉤子中的每個請求創建會話。 Flask docs "SQLAlchemy in Flask"的解決方案使用scoped_session,它具有基本相同的效果(使用線程局部變量,每個線程有一個單獨的會話實現)。

廣告應用程序架構:對於更大的應用程序,最好使用Larger Applications patternsblueprints。所以我所有的燒瓶路由處理程序都將在藍圖中,然後我將有一個「主」功能get_app() 1)創建Flask對象2)用它註冊藍圖3)創建SQLAlchemy引擎並使用Flask app.before_request掛接Session()。大致類似於thisthis


,你應該永遠只能有一個引擎

爲什麼?從技術上講,引擎只是連接(池)到數據庫。如果你的應用使用三個獨立的數據庫會怎樣那麼當然你需要三個引擎。

但是,當然會話連接到一個引擎。所以你需要多個會話。並且爲您的示範課程提供多個聲明性基礎,並且 - 最重要的是 - 不會意外地混淆它。這就是爲什麼建議只有一個引擎 - 如果可能的話。

您可以爲每個請求創建引擎 - 它在技術上是正確的,但效率不高。爲整個應用程序保留一個引擎,並只爲每個請求創建會話。

0

一旦在Flask應用程序上安裝了SQLAlchemy,您將需要創建一個單獨的* .py文件來存儲數據庫配置,並使用import語句將它合併到其他.py文件中以供使用。

如果您想在應用程序本身中查看/創建API數據的表格,它們將駐留在類似'models.py'文件的文件中,該文件還會導入數據庫連接字符串。

這是一個相當不錯的Flask + SQLAlchemy todo應用程序教程,鏈接是她詳細描述文件結構和數據庫實現的部分。

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

下面是一個有點聯繫更加通用但是也可以詳細的步行通關於建立與瓶一SQLAlchemy的數據庫,同時也越過使用ORM的查詢,而不是原始的SQL查詢的一些例子(雖然我一般使用原始的SQL查詢 - 因爲我平時也安裝MySQL &在MySQL中創建工作臺表,但是這只是使用API​​數據)可能是矯枉過正的應用程序:

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