我在设置数据库连接时遇到问题。我想设置连接,我可以在所有 Controller 中看到此连接。
现在我在 Controller 中使用类似的东西:
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
?
最佳答案
我希望你的 Pylons 能够正常工作;对于以后可能会阅读问题的其他人,我将向您提供一些正确方向的指示。
首先,您只是创建一个引擎和一个元数据对象。虽然您可以使用引擎直接创建连接,但您几乎总是使用 session 来管理查询和更新数据库。
Pylons 会自动为您设置此功能,方法是从您的配置文件创建一个引擎,然后将其传递给 yourproject.model.__init__.py:init_model()
,后者将其绑定(bind)到 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 对象.
yourproject.model.meta
中的 scoped_session
、Session
对象自动与作为 yourproject 创建的元数据对象关联.model.meta:metadata
(在 pylons 0.9.7 及以下版本中)或 yourproject.model.meta:Base.metadata
(在 pylons 1.0 中)。使用此元数据对象来定义您的表。正如您在较新版本的 pylons 中看到的,元数据与名为 Base
的 declarative_base()
对象关联,它允许您使用 SqlAlchemy 的声明式样式。
从 Controller 使用它
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()
不过这一切都很好,但你应该做的是......
这说明您并没有真正使用 SqlAlchemy。当您开始将数据库表映射到 Python 类时,SqlAlchemy 的强大功能才真正显现出来。因此,任何想要将 pylon 与数据库一起使用的人都应该认真考虑一下 SqlAlchemy 可以做什么。如果 SqlAlchemy 开始令人生畏,只需从使用其声明性方法开始,这对于几乎所有 pylons 应用程序来说应该足够了。
在您的模型中,不要定义表构造,而是执行以下操作:
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()
、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 ])
关于python - 如何建立与数据库的全局连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2603093/