【问题标题】:Using Python see if Table exists使用 Python 查看 Table 是否存在
【发布时间】:2017-09-12 19:38:20
【问题描述】:

我必须连接到 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

即使我使用通配符也找不到。

【问题讨论】:

  • 你的字符串在print cur.fetchall()的结果中吗?
  • 如果不是,打印 cxRows 会返回什么?

标签: python sql oracle


【解决方案1】:

fetchall() 返回一个元组列表。 所以当你这样做时

for i in cxRows:

'i' 是元组类型。在你的情况下,这个元组将只有一个值。您可以使用 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

【讨论】:

  • 最好在查询中做reg exp匹配。
【解决方案2】:

要改进 @vaichidrewar 的语法,您可以将 fetch 循环简化为:

for tabname, in cur:
    if p.match(str(tabname)):
        print(tabname)

但是在查询中进行正则表达式匹配会更有效率:

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)

“i”选项进行不区分大小写的匹配。您可以根据需要调整正则表达式。

【讨论】:

  • 我首先尝试将它放入查询中,但我无法让它工作,也找不到一个好的例子。你有一个很好的例子。
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 2012-02-19
  • 2012-04-07
  • 2012-01-03
  • 2015-05-18
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多