python - 如何建立与数据库的全局连接?

标签 python sqlalchemy pylons

我在设置数据库连接时遇到问题。我想设置连接,我可以在所有 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_sessionSession 对象自动与作为 yourproject 创建的元数据对象关联.model.meta:metadata(在 pylons 0.9.7 及以下版本中)或 yourproject.model.meta:Base.metadata(在 pylons 1.0 中)。使用此元数据对象来定义您的表。正如您在较新版本的 pylons 中看到的,元数据与名为 Basedeclarative_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/

相关文章:

python - SQLAlchemy 还是 psycopg2?

python - 调用后python中的声明函数

python - 如何将字符串数组转换为字符串数组?

python - 在有很多记录的表中通过 random() 优化顺序

python - 监控多个 Pylons 应用程序

python - 将日志值转换回数字

python - 使用 sql alchemy 更新多个字段

python - SQLAlchemy ORM 转换为 pandas DataFrame

python - 如何创建/修改pylons生成的 Controller 类?

python - UnicodeEncodeError : 'latin-1' codec can't encode character