sheba sql-普通人的sql。
sheba的Python项目详细描述
针对不介意使用sql的人的sql管理。
动机
我编写sql的速度比计算各种库和orm的速度还快 抽象层。直接用代码编写sql是很恶心的。所以 我从Axamol SQL Library那里偷了个主意,还有一些更新 已创建此库。
这是什么?
首先,我们将考虑一些基本的查询定义:
>>> 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语句没有返回行信息。我可以 从技术上讲,要创建第三类语句类型,所以要避免这种情况,但是 你可以忽略这个返回值。
接下来我们将插入几行:
>>> 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}。谢芭会自动 用正确的绑定变量语法替换它并传递 向数据库连接提供值。
注意
乍一看,动态查询可能正在写入 参数值直接输入到sql中。它们是而不是。实际的 传递到模板上下文中的值是将 替换为适合数据库的绑定参数语法 司机。如果你问自己,“如果我真的想要实际价值呢?“。” 您应该去修复所有的sql注入漏洞。
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
许可证
在麻省理工学院的许可下发布。有关详细信息,请参阅许可证文件。