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
正如他们所说,“非常棒。”
可能的查询属性
上面的例子只使用了name、type和sql。仅name和sql是必需的。完整的属性列表是
name - 用于从Python引用此查询的名称
desc - 用于文档的查询说明。
type - query或update。默认为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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 58a381a1b718a28167af0ecf19511188a40c6a137c3682c40406e015a73815bd |
|
MD5 | 5bbbea55740a10600a5eaba0cef47460 |
|
BLAKE2b-256 | bdb85ca5ff8c09344b84a176f34859cc66e8d48fae0d4fb4f7896d3124137a5c |