2010-04-08 22 views
2

我有設置數據庫連接的問題。我想設置連接,我可以在所有控制器中看到這個連接。如何設置數據庫的全局連接?

現在我用這樣的事情在我的控制器:

db = create_engine('mysql://root:[email protected]/python') 
metadata = MetaData(db) 

email_list = Table('email',metadata,autoload=True) 

在development.ini我:

sqlalchemy.url = mysql://[email protected]@localhost/python 
sqlalchemy.pool_recycle = 3600 

如何設置_____init_____.py

回答

0

你想要做的是修改app_globals.py文件中的Globals類以包含.engine(或其他)屬性。然後,在您的控制器中,您使用from pylons import app_globalsapp_globals.engine來訪問引擎(或元數據,會話,scoped_session等)。

2

我希望你有掛架工作;對於稍後可能會閱讀的其他人,我會向正確的方向提出一些建議。

首先,你只是創建一個引擎和一個元數據對象。儘管您可以使用引擎直接創建連接,但您幾乎總是會使用會話來管理查詢和更新數據庫。

主塔通過從配置文件創建一個引擎,然後將它傳遞到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_sessionSession,從yourproject.model.meta對象被自動地爲任一yourproject.model.meta:metadata創建(在掛架0.9.7及以下)或yourproject.model.meta:Base.metadata(在掛架1.0)元數據對象相關聯。使用這個元數據對象來定義你的表。正如您在更新版本的掛架中所看到的,元數據與名爲Basedeclarative_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 ]) 
2

1.0版本的Pylons使用聲明性語法。更多關於這個,你可以看到here

在模式/ init.py你可以寫的財產以後這樣的:

from your_programm.model.meta import Session, Base 
from sqlalchemy import * 
from sqlalchemy.types import * 

def init_model(engine): 
    Session.configure(bind=engine) 

class Foo(Base) : 
    __tablename__ = "foo" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    ... 
相關問題