2017-09-12 11 views
1

Oracleデータベースに接続してテーブルが存在するかどうかを確認する必要があります。私はテーブルのリストを取得することができますが、私が探しているテーブルがリストにあるかどうかを確認するのは難しいです。いくつかのテーブルには、私が参加しなければならないいくつかのテーブルが関連付けられているので、私はチェックする必要があります。Pythonを使用してテーブルが存在するかどうかを確認

私のリストにはどのようなものです:( '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 

それは私がワイルドカードを使用する場合でも、それを見つけることができません。

+1

あなたの文字列は 'print cur.fetchall()'の結果にありますか? – JacobIRR

+0

もしそうでなければ、cxRowsを印刷すると何が返されますか? –

答えて

2

を、あなたはにフェッチループを簡素化することができます:

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) 

「I」オプションは、大文字と小文字を区別しないマッチングを行います。あなたは、あなたが好きなように正規表現を調整することができます。

+0

私は最初にそれをクエリに入れようとしましたが、うまく動作しないか、良い例を見つけることができませんでした。あなたはうまくいった明確な例があります。 –

3

fetchall()はタプルのリストを返します。あなたは

for i in cxRows: 

を行うとき だから「私は」タイプのタプルです。あなたの場合、このタプルは単一の値しか持たないでしょう。あなたはi [0]を使ってそれにアクセスし、それをpとマッチさせることができます。 現在、タプルを文字列に変換しているため、正規表現は一致しません。コードを修正し

:@vaichidrewarの構文を改善するには

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

クエリでreg expのマッチングを行う方が良いです。 –

関連する問題