我在设置数据库连接时遇到问题。我想设置连接,我可以在所有控制器中看到这个连接。
现在我在我的控制器中使用这样的东西:
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
?
答案 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_globals
和app_globals.engine
来访问引擎(或元数据,会话,scoped_session等...)。