如何使用 SQL Alchemy 以编程方式为 Oracle 创建查询字符串限制记录?

皮埃尔喜悦

给定一个 SQL Alchemy 引擎、模式名、表名和有限数量的要返回的记录;我想生成一个可以在引擎中给出的数据库中使用的查询字符串。

如果我在所有情况下都以相同的方式构建我的 sqlalchemy 查询,如下所示:

import sqlalchemy

limit=10
schema='schema_name'
table='table_name'

raw_query = (
    sqlalchemy.select([sqlalchemy.text("*")])
    .select_from(
        sqlalchemy.schema.Table(
            table, sqlalchemy.MetaData(), schema=schema
        )
    )
    .limit(limit)
)

我可以使用 SQL Alchemy compile for Snowflake 成功将此查询编译为字符串形式,如下所示:

snow_engine = sqlalchemy.create_engine('snowflake://{user}:{password}@{account}/'))

query = str(
    raw_query.compile(
        snow_engine, compile_kwargs={"literal_binds": True}
    )
)

print(query)

> SELECT * 
FROM schema_name.table_name
 LIMIT 10

但是,当我为 Oracle 尝试相同的方法时,我丢失了架构和表名:

oracle_engine = sqlalchemy.create_engine('oracle+cx_oracle://{user}:{password}@{host}:{port}/?service_name={service_name}')

query = str(
    raw_query.compile(
        oracle_engine, compile_kwargs={"literal_binds": True}
    )
)

print(query)

> SELECT  FROM DUAL 
WHERE ROWNUM <= 10

我可以使用像这样的 Oracle 特例来让它工作:

raw_query = (
    sqlalchemy.select([sqlalchemy.text("*")])
    .select_from(
        sqlalchemy.schema.Table(
            table, sqlalchemy.MetaData(), schema=schema
        )
    )
)

query = str(
    raw_query.compile(
        snow_engine, compile_kwargs={"literal_binds": True}
    )
)

query += "\nWHERE ROWNUM <= {limit}".format(limit=limit)
print(query)

> SELECT * 
FROM schema_name.table_name
WHERE ROWNUM <= 10

但是没有更隐含的方法来做到这一点吗?

编辑:我正在运行 SQL Alchemy 1.3.8。看起来这个问题在 1.4 中已经解决了。

马麦轰炸机

这适用于我SQLAlchemy-1.4.3的 Oracle

raw_query = (
    sqlalchemy.select('*',table(table_name, schema=schema_name)).limit(limit)
)

生成的 SQL 语句是

SELECT anon_1.*
FROM (SELECT *
FROM schema_name.table_name) anon_1
WHERE ROWNUM <= 10

这正是Oracle 方言中所期望的LIMIT

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

尝试使用 sql alchemy 抛出用户为空字符串的错误连接到 MS SQL Server

使用 sql alchemy 创建flask webapp

SQL Alchemy QueuePool限制溢出

如何在 SQL Alchemy 中使用变量

Flask SQL Alchemy使用!=列条件查询表

SQL Alchemy 查询多个表

sql alchemy 子查询连接

如何使用SQL Alchemy在SQL Server中创建图形节点表?

Oracle SQL编程查询

如何在Oracle SQL查询中使用方括号之间的几行提取字符串

如何使用变量列表创建sql查询字符串?

SQL Alchemy python DELETE记录,奇怪的模式

在SQL Alchemy ORM中使用辅助联接

使用整数作为SQL Alchemy可选

在SQL Alchemy中查询多对多

执行大型查询时 SQL Alchemy 超时

Oracle PL/SQL:如何根据同一记录的 ID 字段返回字符串值?

如何使用PL / SQL从Oracle中的字符串中提取子字符串?

Oracle SQL:如何使用to_char转换字符串中的子字符串

Flask SQL Alchemy-如何通过表单一次更新多个记录

如何在 SQL SELECT 查询 (Oracle) 中直接用特定值替换字符串

如何在Oracle SQL查询中的方括号之间提取字符串

如何通过按行求和(SQL Alchemy)来创建布尔掩码?

使用 sql alchemy 查询有没有办法遍历表中的所有列

Python - 在 Oracle SQL 查询中使用字符串文字

使用 SQL Alchemy 在 SQL 执行中迭代 2 个列表

Oracle SQL - 如何使用 SUBSTR 从字符串中删除字符?

oracle sql如何合并列字符串值

如何在Oracle SQL中选择子字符串