2016-03-23 19 views
1

dizeleri bir listesini verir Ben Windows 7 Python2.7 kullanın ve bir mysql sunucu, pymssql ile bağlantı.Bir sql-query [Python]

Sorunum: Çok büyük bir veritabanım var ve bir listeden bir çok sözcükten (dize) eşleşen nesnelerin kimliğini seçmek istiyorum, programımı veriyorum. Bu sorguda, listemdeki bu kelimeler için% LIKE% ...% bir ifade olmalı.

Şimdiye kadar Python-Script'imi Veritabanıma bağladım ve bir imleç tanımladım. Sonra aradığım kelime ile küçük listesini hazırladık ve daha sonra Sorgumda bazı tutucuları yarattı:

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
     WHERE BO_BEMERKUNG IN ({})""".format(placeholders) 

Ben arıyorum:

İşte
wortliste = ['Bruch', 'Verwerfung'] 
placeholders = ','.join(['%s'] * len(wortliste)) 

benim Sorgu olduğunu tek kelime, burada kelimenin 'Bruch' için örneğin benim sorgu şu şekilde görünecektir:

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
     WHERE BO_BEMERKUNG LIKE '%Bruch%'""" 

tek bir kelime için bu sorgu sağ Id (= BO_INDEX) eşleşir. Yer tutucularla yapılan sorgu kilitlenmiyor, ancak hiçbir şeyle eşleşmiyor :(

Ama veritabanımı bir iki kelimeye ayırmayı ve listedeki her sözcük (dize) için eşleşen kimlikleri eklemeyi seviyorum (= wortliste) ve yeni bir listeye ekler. gerçekten bu sorunu çözmek için nasıl dont't

!

bu sorunu çözmeye her yeni yol için minnettarım! Teşekkür!

cevap

0

DÜZENLEME 2:

sen (seni örnek kullanarak) liste üzerinde döngü istiyoruz ve çıkışına ekleme edin:

words = ['ab', 'cd', 'ef'] 
abfrage_list = [] 
for w in words: 
    # Generate a query 
    query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
     WHERE BO_BEMERKUNG LIKE '%%%s%%' """ % w 
    # Execute that query and get results 
    cur.execute(query) 
    result_all = cur.fetchall() 
    # Add those results to your final list 
    for i in result_all: 
     abfrage_list.append(i) 

DÜZENLEME:

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE BO_BEMERKUNG LIKE '%ab%' 
    OR O_BEMERKUNG LIKE '%cd%' 
    OR O_BEMERKUNG LIKE '%ef%' """ 

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE {params}""".format(
     params=" OR ".join("BO_BEMERKUNG LIKE '%%%s%%' \n" % w for w in wortliste) 
    ) 
print(query) 
: Birden like s ile Örneğin

Baskılar:

SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE BO_BEMERKUNG LIKE '%Bruch%' 
OR BO_BEMERKUNG LIKE '%Verwerfung%' 
kelime listesindeki öğelerin hiçbirini içermiyor

Sizin tutucuları kullanın:

placeholders = ','.join("'%s'" % w for w in wortliste) 

Örneğin:

wortliste = ['Bruch', 'Verwerfung'] 
print(','.join(['%s'] * len(wortliste))) 
print(','.join("'%s'" % w for w in wortliste)) 

Baskı:

%s,%s 
'Bruch','Verwerfung' 
+0

Evet, bu doğru! – Hardinger

+0

Ancak sorgum hala bir şeyle eşleşmiyor, LIKE '% ...%' - ifadesini dahil etmeliyim, ancak bu örnek için nasıl olduğunu bilmiyorum. – Hardinger

+0

Ne tür bir sorgu oluşturmak istediğinizi biliyor musunuz, bu soruyu ekleyebilir misiniz? Belki bunu kullanmak istersiniz: http://stackoverflow.com/questions/12957993/how-to-use-sql-like-condition-with-multiple-values-in-postgresql – Bahrom

0

Örneği için aşağıdaki liste = ['ab', 'cd', 'ef']

query = """ SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE BO_BEMERKUNG LIKE '%ab%' 
    OR O_BEMERKUNG LIKE '%cd%' 
    OR O_BEMERKUNG LIKE '%ef%' """ 

cur.execute(query) 
result_all = cur.fetchall() 

abfrage_list = [] 
for i in result_all: 
    abfrage_list.append(i) 

Bu listede, muhtemelen yüzlerce dizede bu işleme ihtiyacım var. Bu listeyi açmam gerekiyor ve sorgudaki LIKE ifadesine ihtiyacım var, aksi halde bir şey yakalamayacak.

+0

Düzenlenmiş cevabımı gör – Bahrom