如何设置数据库的全局连接?

时间:2010-04-08 20:09:21

标签: python sqlalchemy pylons

我在设置数据库连接时遇到问题。我想设置连接,我可以在所有控制器中看到这个连接。

现在我在我的控制器中使用这样的东西:

db = create_engine('mysql://root:password@localhost/python')
metadata = MetaData(db)

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

在development.ini中我有:

sqlalchemy.url = mysql://root@password@localhost/python
sqlalchemy.pool_recycle = 3600

如何设置_____init_____.py

3 个答案:

答案 0 :(得分:2)

我希望你有塔的工作;对于其他可能稍后阅读问题的人,我会提出正确方向的一些指示。

首先,您只是创建引擎和元数据对象。虽然您可以使用引擎直接创建连接,但几乎总是使用会话来管理查询和更新数据库。

Pylons会自动为您设置此功能,方法是从配置文件创建引擎,然后将其传递给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的{​​{1}},Session对象自动与创建为yourproject.model.meta(在pylons 0.9.7及更低版本中)或{{{ 1}}(在pylons 1.0中)。使用此元数据对象来定义表。正如您在较新版本的pylons中所看到的,元数据与名为yourproject.model.meta:metadata的{​​{1}}对象相关联,这允许您使用SqlAlchemy的声明式样式。

使用控制器中的

yourproject.model.meta:Base.metadata

使用实际连接

如果您真的想获得连接对象,只需使用

declarative_base()

然而这一切都很好,但你应该做的是......

这表明你并没有真正使用SqlAlchemy。当您开始将数据库表映射到python类时,SqlAlchemy的强大功能真的很棒。因此,任何想要将数据库与数据库一起使用的人都应该认真考虑使用SqlAlchemy可以做些什么。如果SqlAlchemy开始恐吓,那就开始使用它的声明式方法,这对于几乎所有的pylons应用程序都应该足够了。

在您的模型中,而不是定义表构造,请执行以下操作:

Base

请注意查询对象。这些是智能对象,它们存在于类中,并将您的类与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) ,Session相关联。这使您可以更轻松地从数据库中提取数据。

from yourproject.model import Session
connection = Session.connection()
result = connection.execute("select 3+4;")
// more connection executions
Session.commit()

答案 1 :(得分:2)

1.0版本的Pylons使用声明性语法。有关此内容的更多信息,请参阅here

在mode / 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)
    ...

答案 2 :(得分:0)

您要做的是修改Globals文件中的app_globals.py类,以包含.engine(或其他)属性。然后,在您的控制器中,使用from pylons import app_globalsapp_globals.engine来访问引擎(或元数据,会话,scoped_session等...)。