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

就像他们说的,“太棒了。”

可能的查询属性

上面的示例仅使用nametypesql。只有namesql绝对是必需的。完整的属性列表是:

  • name-用于从python引用此查询的名称
  • desc-对文档查询的解释。
  • type-queryupdate。默认为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

许可证

在麻省理工学院的许可下发布。有关详细信息,请参阅许可证文件。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java在未知属性上的PUT和POST失败会引发不同的行为   java无法使GWTRPC正常工作   java如何在安卓中更改一个特定视图的主题?   机器学习为什么改变了java中等式的两面?   java继承和重定向标准输出   java为什么Clojure中嵌套循环/重复速度慢?   使用JavaParser解析Java代码并查找父节点的语句类型   java读取类的方法并在arraylist中存储Web服务的路径名   java模板聚合匹配和投影一个没有id的字段   java为什么给定数组不返回false   java如何链接JLabel和JSpinner以调整大小   在java中,当过滤器只返回一个对象时,如何使用流和过滤器将值填充到对象中   java为什么使用getInstance   如何得到我的。运行java命令的bat文件