跳转到主要内容

为使用SQLAlchemy在WSGI应用程序中提供了一种合理的方法

项目描述

摘要

  • 为使用SQLAlchemy在WSGI应用程序中提供了一种合理的方法

开始使用

简介

SQLAlchemy有两个问题

  • 它非常强大,因此可以用在很多不同的方式,但理解不同的选项可能很困难。

  • 为了在Pylons中使SQLAlchemy更简单,使用了scoped_session、g、MetaData等对象,这些对象进一步抽象了用户对正在发生的事情的了解,并且在试图掌握它时,使SQLAlchemy看起来更加难以理解。

这个中间件在WSGI中间件中设置了标准的SQLAlchemy对象,而不做任何特别聪明的事情,也不使用任何全局对象。

除了在Pylons等框架中使事情稍微简单一些之外,本模块中推荐的设置还提供了其他应用程序(如AuthKit,它可以使用自己的SQLAlchemy对象)的API,以便与其他应用程序的SQLAlchemy对象一起设置,即使这些应用程序依赖于数据库也是如此。这反过来又允许开发者对代码的某些部分进行组件化,即使它们依赖于数据库。

教程

以下是SQLAlchemyManager在Pylons应用程序中的使用方法。

在你的config/middleware.py文件顶部

from yourproject.model import setup_model
from sqlalchemymanager import SQLAlchemyManager

然后,在设置PylonsApp的行之后

app = SQLAlchemyManager(app, app_conf, [setup_model])

你的model/__init__.py文件看起来像这样

from sqlalchemy import Column, Table, types
from sqlalchemy.orm import mapper, relation

def setup_model(model, metadata, **p):
    model.table1 = Table("table1", metadata,
        Column("id", types.Integer, primary_key=True),
        Column("name", types.String, nullable=False),
    )
    class MyClass(object):
        pass
    model.MyClass = MyClass
    model.table1_mapper = mapper(model.MyClass, model.table1)

这意味着你可以编写这样的代码

from sqlalchemy.sql import select

def app(environ, start_response):
    # The model is the same across requests so is safe to save as a global
    # somewhere in your application.
    model = environ['sqlalchemy.model']
    # You will get a new session object on each request so you shouldn't save it
    session = environ['sqlalchemy.session']

    # Use the SQLExpression API via the session object
    select_statement = select([model.table1])
    select_result = [row for row in session.execute(select_statement)]

    # Or use the ORM API
    mr_jones = model.MyClass()
    mr_jones.name = 'Mr Jones'
    session.save(mr_jones)
    session.commit()
    multiple_mr_jones = session.query(model.MyClass).filter(model.MyClass.name=='Mr Jones').all()

    # Return the data
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return [
        '''
Select Result:
%s

Mr Jones Results:
%s
        '''%(
            select_result,
            ', '.join([person.name for person in multiple_mr_jones])
        )
    ]

请注意,我们正在使用 SQLAlchemy 的 ORM 和 SQL 表达式功能,并且连接池等选项仍然可以完美工作。此外,现有的 SQLAlchemy 配置无需太多修改即可与该中间件配合使用。只需将它们的模型定义包装在函数中,并确保所有 SQLAlchemy 对象都显式地分配给 model 即可。

这是基础知识。如果您要创建表,有多种方法可以做到这一点

您可以在请求期间创建所需的表,如下所示

# Create the tables
environ['sqlalchemy.manager'].create_all()

或者如果您正在使用脚本,您可以这样做

from yourproject.model import setup_model
from sqlalchemymanager import SQLAlchemyManager

然后,在设置PylonsApp的行之后

manager = SQLAlchemyManager(None, app_conf, [setup_model])
manager.create_all()

要进行任何操作,您需要创建自己的会话

connection = manager.engine.connect()
session = manager.session_maker(bind=connection)
try:
    # Do stuff here
    pass
finally:
    session.close()
    connection.close()

变更

0.1.0

  • 第一版

许可

MIT 许可证

版权所有 (c) 2007 James Gardner

在此特此授予任何获得本软件及其相关文档文件(“软件”)副本的个人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供方提供软件的个人这样做,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定目的和未经侵权的保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些责任是在合同、侵权或其他方式中产生的,以及与软件或软件的使用或其他交易有关。

下载

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。

源分布

SQLAlchemyManager-0.1.0.tar.gz (9.2 kB 查看哈希值)

上传时间

构建分布

SQLAlchemyManager-0.1.0-py2.4.egg (8.4 kB 查看哈希值)

上传时间

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面