2016-03-23 4 views
1

Ich verwende Python2.7 auf Windows 7 und einen MySQL-Server, Verbindung von Pymssql.Geben Sie eine Liste von Zeichenfolgen zu einer SQL-Abfrage [Python]

Mein Problem: Ich habe eine sehr große Datenbank und ich möchte die IDs von Objekten auswählen, die einem von mehreren Wörtern (String) aus einer Liste entsprechen, die ich meinem Programm gebe. In dieser Abfrage muss auch ein LIKE% ...% Ausdruck für diese Wörter aus meiner Liste sein.

Bisher habe ich mein Python-Script mit meiner Datenbank verbunden und einen Cursor definiert. Dann machte ich eine kleine Liste mit den Worten, ich suche und ich geschaffen für meine Abfrage einige Platzhalter später:

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

Hier meine Frage ist:

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

Wenn ich für eine bin auf der Suche Wort, hier zum Beispiel für das Wort ‚Bruch‘, meine Abfrage würde wie folgt aussehen:

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

diese Abfrage für ein einzelnes Wort entspricht den rechte IDs (= BO_INDEX). Die Abfrage mit den Platzhaltern stürzt nicht ab, aber es hat nichts gefunden :(

Aber ich mag meine Datenbank für ein paar Wörter Schleife und fügen Sie die passenden IDs für jedes Wort (string) in meiner Liste (= wortliste) und in eine neue Liste anhängen.

ich wirklich dont't wissen, wie dieses Problem zu lösen!

ich bin dankbar für jeden neuen Weg, um diese Herausforderung zu lösen! Dank!

Antwort

0

EDIT 2:

Wenn Sie eine Schleife über die Liste wollen und an den Ausgang anhängen (Ihrem Beispiel verwenden):

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) 

EDIT:

Für Ihr Beispiel mit mehreren like s:

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) 

Abzüge:

SELECT BO_INDEX FROM GeoTest.dbo.Tabelle_Bohrung 
    WHERE BO_BEMERKUNG LIKE '%Bruch%' 
OR BO_BEMERKUNG LIKE '%Verwerfung%' 

Ihre Platzhalter nicht eines der Elemente aus Ihrer Wortliste enthält, verwenden:

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

Zum Beispiel:

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

Drucke:

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

Ja, das stimmt! – Hardinger

+0

Aber meine Abfrage stimmt immer noch nicht überein, ich muss den LIKE '% ...%' - Ausdruck einfügen, aber ich weiß nicht, wie für dieses Beispiel. – Hardinger

+0

Wissen Sie, welche Abfrage Sie erstellen möchten, können Sie das zur Frage hinzufügen? Vielleicht möchten Sie dies verwenden: http://stackoverflow.com/questions/12957993/how-to-use-sql-like-condition-with-multiple-values-in-postgresql – Bahrom

0

zum Beispiel die folgende 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) 

Aber ich brauche dieses Verfahren für möglicherweise Hunderte von Strings in dieser Liste. Ich muss diese Liste durchlaufen und ich brauche den LIKE-Ausdruck in der Abfrage, sonst wird nichts gefangen.

+0

sehe meine bearbeitete Antwort – Bahrom

Verwandte Themen