我正在使用cx_Oracle模块连接到oracle数据库。在脚本中,我使用了两个变量schema_name和table_name。下面的查询可以正常工作
cur1.execute("select owner,table_name from dba_tables where owner ='schema_name'")但是我需要查询表的行数,其中我需要用schema_name限定table_name,因此查询应该是
SELECT count(*) FROM "schema_name"."table_name"
这在代码中使用时不起作用,我尝试将其放在三重引号,单引号和其他选项中,但它没有按预期格式化查询,因此错误与表不存在。
任何指导都是值得感谢的。
发布于 2021-02-19 07:46:30
可以使用包含占位符的预准备语句,占位符的变量形式为...{}.{}".format(sc,tb)
sc='myschema'
tb='mytable'
cur1.execute("SELECT COUNT(*) FROM {}.{}".format(sc,tb))
print(cur1.fetchone()[0])发布于 2021-02-19 07:01:53
在这种情况下,您还可以尝试设置Connection.current_schema,请参阅cx_Oracle API doc
例如,如果您在自己的模式中创建表:
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代码:
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)输出将为:
(1,)
('SYSTEM',)最后一个查询显示正在更改的不是用户,但只有第一个查询自动从'ffff‘更改为'CJ.ffff’。
https://stackoverflow.com/questions/66268922
复制相似问题