【问题标题】:SQL query templating in Python to emulate Periscope Data在 Python 中使用 SQL 查询模板来模拟 Periscope 数据
【发布时间】:2017-09-19 17:13:23
【问题描述】:

是否有人知道用于特定于 SQL 的模板的工具或库,最好是在 Python 中?

我正在寻找 Periscope Data 的 SQL 方言中的类似功能,例如 automatic joins 和 SQL sn-ps。

我可以自己用各种模板语言(如 Jinja)来近似这个,但如果在设计时考虑到特定于 SQL 的用例,那就太好了。

另外请注意,这适用于 ORM 没有意义的分析用例,编写 SQL 会更方便。我正在寻找对分析师友好的 SQL,其快捷方式如 select * from [table1+table2] 等。

【问题讨论】:

  • 嗯,除了许多其他事情,ORM 还知道如何自动连接表,如果您要求它关联特定对象。如果你不熟悉它,你绝对应该看看SQLAlchemy。但它的功能远不止 SQL 模板。
  • 已编辑以表明我正在专门研究分析用例,其中 ORM 并不适合。
  • 这个问题可能比Stack Overflow 更适合Software Recommendations(或也许 Database Administrators)。
  • 提出了关于软件推荐的问题并进行了近距离投票

标签: python sql templating


【解决方案1】:

我从未使用过 Periscope Data,但看起来您可能正在寻找类似 SQLAlchemy 的东西。 SQLAlchemy 可以与 SQLAlchemy ORM 一起使用,例如与 SQLAlchemy 表达式语言(来自tutorial)一起使用:

stmt = select([users.c.name, addresses.c.email_address]).\
    select_from(users.join(addresses)).\
    limit(1).offset(1)
result = conn.execute(stmt).fetchall()

相当于运行如下SQL语句:

SELECT users.name, addresses.email_address
FROM users JOIN addresses ON users.id = addresses.user_id
LIMIT ? OFFSET ?
# data for parameterized query: (1, 1)

或者在使用 ORM 时(来自tutorial):

result = session.query(User).join(Address).\
    filter(Address.email_address=='jack@google.com').\
    all()

相当于这个SQL查询:

SELECT users.id AS users_id,
        users.name AS users_name,
        users.fullname AS users_fullname,
        users.password AS users_password
FROM users JOIN addresses ON users.id = addresses.user_id
WHERE addresses.email_address = ?
# data for parameterized query: ('jack@google.com',)

SQLAlchemy 可以根据表定义和/或模型上配置的外键关系猜测自动连接条件。

通常,SQLAlchemy 不会自省预先存在的表上的关系,而是使用 SQLAlchemy 表定义和/或模型中明确定义的关系,但您可以使用 autoloadautomap 来自省表定义模型如果你真的想这样做,现有的数据库。

【讨论】:

  • 除了我正在寻找具有快捷方式的分析师友好的 SQL 语法,而不是用于构建查询的 Python DSL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
相关资源
最近更新 更多