我希望你有掛架工作;對於稍後可能會閱讀的其他人,我會向正確的方向提出一些建議。
首先,你只是創建一個引擎和一個元數據對象。儘管您可以使用引擎直接創建連接,但您幾乎總是會使用會話來管理查詢和更新數據庫。
主塔通過從配置文件創建一個引擎,然後將它傳遞到yourproject.model.__init__.py:init_model()
,它將它綁定到一個scoped_session
對象,自動爲您設置。
此scoped_session對象可從yourproject.model.meta
獲得,並且是您用來查詢數據庫的對象。例如:
record = meta.Session.query(model.MyTable).filter(id=42)
因爲它是一個scoped_session,它會自動創建一個Session對象,並將它與當前線程關聯(如果它尚不存在)。 Scoped_session將所有動作(.query(),.add(),.delete())傳遞到實際的Session對象中,從而允許您以一種簡單的方式與數據庫進行交互,並顯式管理非線程安全的Session對象。
的scoped_session
,Session
,從yourproject.model.meta
對象被自動地爲任一yourproject.model.meta:metadata
創建(在掛架0.9.7及以下)或yourproject.model.meta:Base.metadata
(在掛架1.0)元數據對象相關聯。使用這個元數據對象來定義你的表。正如您在更新版本的掛架中所看到的,元數據與名爲Base
的declarative_base()
對象相關聯,該對象允許您使用SqlAlchemy的聲明式風格。
從控制器使用該
from yourproject import model
from yourproject.model import Session
class MyController(..):
def resource(self):
result = Session.query(model.email_list).\
filter(model.email_list.c.id=42).one()
return str(result)
使用真正的連接
如果你真的想要得到一個連接對象,只需使用
from yourproject.model import Session
connection = Session.connection()
result = connection.execute("select 3+4;")
// more connection executions
Session.commit()
然而這一切都很好,但你應該做的是...
這留下你不reall Ÿ使用SqlAlchemy很多。當您開始將數據庫表映射到python類時,SqlAlchemy的強大功能確實發揮了作用。所以任何想用數據庫使用掛鉤的人都應該認真考慮一下你可以用SqlAlchemy做什麼。如果SqlAlchemy開始使用它的聲明式方法開始進行威脅,那麼對於幾乎所有的應用程序來說,這應該足夠了。
在你的模型而不是定義表結構,這樣做:
from sqlalchemy import Column, Integer, Unicode, ForeignKey
from sqlalchemy.orm import relation
from yourproject.model.meta import Base
class User(Base):
__tablename__ = 'users'
# primary_key implies nullable=False
id = Column(Integer, primary_key=True, index=True)
# nullable defaults to True
name = Column(Unicode, nullable=False)
notes = relation("UserNote", backref="user")
query = Session.query_property()
class UserNote(Base):
__tablename__ = 'usernotess'
# primary_key implies nullable=False
id = Column(Integer, primary_key=True, index=True)
userid = Column(Integer, index=True, ForeignKey("User.id"))
# nullable defaults to True
text = Column(Unicode, nullable=False)
query = Session.query_property()
注意的查詢對象。這些是生活在課堂上的智能對象,並將課程與會話的scoped_session()
相關聯。這使您可以更輕鬆地從數據庫中提取數據。
from sqlalchemy.orm import eagerload
def resource(self):
user = User.query.filter(User.id==42).options(eagerload("notes")).one()
return "\n".join([ x.text for x in user.notes ])