首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python cx_Oracle模块:无法在代码中格式化查询

问Python cx_Oracle模块:无法在代码中格式化查询
EN

Stack Overflow用户
提问于 2021-02-19 06:12:33
回答 2查看 119关注 0票数 0

我正在使用cx_Oracle模块连接到oracle数据库。在脚本中,我使用了两个变量schema_name和table_name。下面的查询可以正常工作

代码语言:javascript
复制
cur1.execute("select owner,table_name from dba_tables where owner ='schema_name'")

但是我需要查询表的行数,其中我需要用schema_name限定table_name,因此查询应该是

SELECT count(*) FROM "schema_name"."table_name"

这在代码中使用时不起作用,我尝试将其放在三重引号,单引号和其他选项中,但它没有按预期格式化查询,因此错误与表不存在。

任何指导都是值得感谢的。

EN

回答 2

Stack Overflow用户

发布于 2021-02-19 07:46:30

可以使用包含占位符的预准备语句,占位符的变量形式为...{}.{}".format(sc,tb)

代码语言:javascript
复制
sc='myschema'
tb='mytable'

cur1.execute("SELECT COUNT(*) FROM {}.{}".format(sc,tb))
print(cur1.fetchone()[0])
票数 1
EN

Stack Overflow用户

发布于 2021-02-19 07:01:53

在这种情况下,您还可以尝试设置Connection.current_schema,请参阅cx_Oracle API doc

例如,如果您在自己的模式中创建表:

代码语言:javascript
复制
SQL> show user
USER is "CJ"
SQL> create table ffff (mycol number);

Table created.

SQL> insert into ffff values (1);

1 row created.

SQL> commit;

Commit complete.

然后运行以不同用户身份连接的Python代码:

代码语言:javascript
复制
import cx_Oracle
import os

import sys, os
if sys.platform.startswith("darwin"):
    cx_Oracle.init_oracle_client(lib_dir=os.environ.get("HOME")+"/Downloads/instantclient_19_8")

username = "system"
password = "oracle"
connect_string = "localhost/orclpdb1"

connection = cx_Oracle.connect(username, password, connect_string)

connection.current_schema = 'CJ';

with connection.cursor() as cursor:
    sql = """select * from ffff"""
    for r in cursor.execute(sql):
        print(r)

    sql = """select sys_context('USERENV','CURRENT_USER') from dual"""
    for r in cursor.execute(sql):
        print(r)

输出将为:

代码语言:javascript
复制
(1,)
('SYSTEM',)

最后一个查询显示正在更改的不是用户,但只有第一个查询自动从'ffff‘更改为'CJ.ffff’。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66268922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档