2017-03-09 5 views
0

Ich versuche, einige Zeichenfolgen aus einem Array von Zeichenfolgen mithilfe der Zeichenfolgenformatierung einzufügen.Python-String-Formatierung: Problem mit einfachen Anführungszeichen

Aber aus irgendeinem Grund füllt Python das erste% s mit der gewünschten Zeichenfolge, aber umgeben von einfachen Anführungszeichen.

Gibt es eine explizite Möglichkeit, dieses Verhalten zu verhindern?

Beispiel:

myString = [['000b', 
    '1', 
    'Text1', 
    '1.74', 
    'Text2', 
    'None'], 
['000b', 
    '1', 
    'TextA', 
    '12.92', 
    'TextB', 
    'None']] 

Wenn ich laufen die folgenden:

cursor.executemany("INSERT INTO schema.myTable_%s_name (col1, col2, col3, col4, col5) VALUES (%s, NULLIF(%s,'None')::decimal, NULLIF(%s,'None')::decimal, %s, NULLIF(%s,'None')::int)", myString[0:len(myString)]) 

das erwartete Verhalten ist, dass der Tabellenname wird schema.myTable_000b_name aber Python schreibt schema.myTable_'000b'_name die natürlicherweise das SQL vom Laufen verhindert. Wie kann ich angeben, dass die einfachen Anführungszeichen nicht eingefügt werden sollen?

Antwort

1

Dies funktioniert nicht so, wie Sie es denken sollten.

Die Prozedur executemany erstellt eine SQL-Anweisung und führt dann die gleiche Anweisung aus und bindet sie an verschiedene Parameter. Auf diese Weise können Sie z.B. Fügen Sie schnell viele Zeilen in eine Tabelle ein.

Dies erlaubt nicht, mehrere verschiedene SQL-Anweisungen mit jeweils eigenen Parametern auszuführen. Die Interpolation von Tabellennamen aus Parametern wird nicht unterstützt. Die Tatsache, dass es versucht zu arbeiten, ist eine Kuriosität, kein Feature.

Wenn Sie in viele Tabellen einfügen müssen, geben Sie so viele INSERT-Anweisungen ein. Berechne den Tabellennamen mit normaler Python-Interpolation. Der DB-Treiber versucht, den Parameter, der sich in der Mitte eines Tabellennamens befindet, als Varchar-Konstante zu interpretieren, indem er ihn korrekt zitiert.

0

Wenn ich SQL-Strings mit Python erzeuge, würde ich wirklich vorschlagen, dass Sie in die .format(key=value) Syntax von Python schauen. Siehe https://pyformat.info. Dies ermöglicht eine großartige und sehr intuitive Erstellung von Abfragen.

my_array = [{table: 'something',value: 'something_else'}] 

for opts in my_array: 
    query = 'select * into {table} from some_table where x = {value}'.format(**opts) 
+0

Hey, kleine Bobby Tables genannt, wollte deine Datenbank zurück: 'opts = {'table': 'harmlos_tabelle', 'value': '10; DROP DATABASE PROD; '} '. Außerdem stammt Ihr Dictionary-Literal von JavaScript, nicht von Python. – 9000

+0

Danke für den Javascript-Hinweis, war nicht so scharf. Die Formatierung ist intern nicht immer ein Problem (schließlich heißt sie my_array und nicht your_array) und ist in fast jeder Formatierungsweise gleichermaßen gültig;) – Roelant

Verwandte Themen