我必须连接到Oracle数据库并查看是否存在表。虽然我可以得到一个表的列表,但我很难看到我正在寻找的表是否在列表中。有些表有关联表,我必须加入,有些表没有,因此我必须检查。
我的清单中有什么:('NYSDOH_CI_EI_HOSPITAL')
sql = "SELECT table_name FROM all_tables"
cur.execute(sql)
searchstr = 'NYSDOH_CI_EI_HOSPITAL'
p = re.compile(searchstr)
#create data array to load in SQL results in.
ciDataSet = []
cxRows = cur.fetchall()
for i in cxRows:
#print i # list of tables
if p.match(str(i)):
print i
即使我使用通配符,也找不到它。
答案 0 :(得分:3)
fetchall()返回元组列表。 所以当你这样做时
for i in cxRows:
'我'是类型元组。在您的情况下,此元组将只有单个值。您可以使用i [0]访问它并将其与p匹配。 目前您正在将元组转换为字符串,因此正则表达式将不匹配。
更正后的代码:
sql = "SELECT table_name FROM all_tables"
cur.execute(sql)
searchstr = 'NYSDOH_CI_EI_HOSPITAL'
p = re.compile(searchstr)
#create data array to load in SQL results in.
ciDataSet = []
cxRows = cur.fetchall()
for i in cxRows:
#print i # list of tables
if p.match(str(i[0])):
print i
答案 1 :(得分:2)
要改进@vaichidrewar的语法,可以将获取循环简化为:
for tabname, in cur:
if p.match(str(tabname)):
print(tabname)
但是在查询中进行reg exp匹配会更有效:
sql = "select table_name from all_tables where regexp_like(table_name, :tn, 'i')"
searchstr = 'EMP'
cur.execute(sql, (searchstr,))
for tabname, in cur:
print(tabname)
'我'选项执行不区分大小写的匹配。您可以根据需要调整正则表达式。