跳转到主要内容

Sheba SQL - 为普通人设计的SQL。

项目描述

为不介意SQL的人设计的SQL管理。

动机

我能比想出各种库和ORM抽象层更快地编写SQL。直接在代码中编写SQL相当令人作呕。所以,我从Axamol SQL库中偷了一个主意,并在此基础上进行了一些更新,创建了此库。

这是什么?

首先,我们将考虑一些基本的查询定义

>>> queries = """
... name: create_roles_table
... type: update
... sql: |
...     CREATE  TABLE roles
...     (
...         scene   text,
...         name    text,
...         actor   text,
...         UNIQUE(scene, name)
...     )
... ---
... name: add_role
... type: update
... sql: |
...     INSERT
...     INTO    roles(scene, name, actor)
...     VALUES  (${scene}, ${name}, ${actor})
... ---
... name: list_roles
... sql: |
...     SELECT  name,
...             actor
...     FROM    roles
...     ORDER   BY
...             name ASC
... ---
... name: get_role_attr
... sql: |
...     SELECT  ${col | ident}
...     FROM    roles
...     WHERE   name = ${name}
... """
>>>

这是一个定义了一些查询的YAML文件,用于处理一个列出场景、角色和演员的简单表。通常,您会在Python包中的文件中定义您的查询,并使用静态方法sheba.Library.from_file(path)来加载查询。

现在,在代码中使用这些

>>> import sheba
>>> conn = sheba.connect(queries, driver='sqlite3', args=(':memory:',))

现在我们已经建立了连接,让我们创建角色表

>>> conn.u.create_roles_table()
-1

这里-1是由于DDL语句不返回行信息。我可以技术上创建第三类语句类型以避免这种情况,但在非doctest世界中,您可以忽略那个返回值。

接下来,我们将插入几行

>>> conn.u.add_role(scene="Parrot Sketch", name="MR PRALINE", actor="John Cleese")
1
>>> conn.u.add_role(scene="Parrot Sketch", name="SHOP OWNER", actor="Machale Palin")
1
>>> conn.u.add_role(scene="Parrot Sketch", name="DEAD PARROT", actor="Fake Parrot")
1

是的,就这么简单。最后,我们将列出表中的角色

>>> for row in conn.q.list_roles():
...     print "Name: %(name)s Actor: %(actor)s" % row
...
Name: DEAD PARROT Actor: Fake Parrot
Name: MR PRALINE Actor: John Cleese
Name: SHOP OWNER Actor: Machale Palin

正如他们所说,“非常棒。”

可能的查询属性

上面的例子只使用了nametypesql。仅namesql是必需的。完整的属性列表是

  • name - 用于从Python引用此查询的名称

  • desc - 用于文档的查询说明。

  • type - queryupdate。默认为query

  • dbs - 将与此SQL一起工作的数据库名称列表。默认为

    值是None,这被解释为“当当前连接的数据库连接没有定义SQL时,请使用此查询。”

  • sql - 实际的查询。SQL通过Mako传递,并可以访问

    查询中提供的任何参数名称。要在查询中绑定参数,只需使用标准的Mako语法打印值,如${my_parameter_name}。Sheba将自动将其替换为适当的绑定变量语法,并将提供的值传递给数据库连接。

SQL中的标识符

如果您特别聪明,支持在SQL语句中动态设置标识符名称。

给定以下YAML查询

name: get_role_attr
sql: |
    SELECT ${col | ident}
    FROM    roles
    WHERE   name = ${name}

然后您可以像这样执行此查询

>>> for row in conn.q.get_role_attr({"col": "actor", "name": "MR PRALINE"}):
...     print "%(actor)s" % row
...
John Cleese

指定连接细节

您可以在YAML文件顶部创建一个文档,列出连接数据库时使用的参数,而不是在代码中指定您的数据库连接细节。这些设置带有可以用于引用特定配置的名称。例如

>>> yaml = """\
... name: dev
... type: connection
... driver: sqlite3
... args: [":memory:"]
... ---
... name: prod
... type: connection
... driver: sqlite3
... args: ["/path/to/prod.db"]
... ---
... name: create_table
... type: update
... sql: CREATE TABLE foo(a int primary key);
... ---
... name: insert_a
... type: update
... sql: INSERT INTO foo(a) values(3);
... ---
... name: get_a
... sql: SELECT a from foo where a = 3;
... """
>>> conn = sheba.connect(yaml, "dev")
>>> conn.u.create_table()
-1
>>> conn.u.insert_a()
1
>>> conn.q.get_a().fetchone()["a"]
3

许可证

在MIT许可证下发布。有关更多详细信息,请参阅LICENSE文件。

项目详情


下载文件

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

源分发

sheba-0.0.7.tar.gz (22.3 kB 查看哈希)

上传时间

由以下机构支持

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