Ist diese Streichersubstitution bei der Erstellung von SQL-Abfragen verpönt, wie vergeben Sie den Tabellennamen dynamisch?

Ziemlich neu in sqlite3, also bär mit mir hier

Ich hätte gern eine Funktion, auf die ich den Tabellennamen übergeben kann und die zu aktualisierenden Werte.

Zuerst habe ich mit so etwas begonnen:

def add_to_table(table_name, string): cursor.execute('INSERT INTO {table} VALUES ({var})' .format( table=table_name, var=string) ) 

Das funktioniert A-OK, aber weiter lesen über sqlite3 schlug vor, dass dies eine furchtbar unsichere Art war, über Dinge zu gehen. Allerdings mit ihren ? Syntax kann ich keinen Namen geben, um die Variable anzugeben.

Ich habe versucht, in einem ? Anstelle der Tabelle, aber das wirft einen Syntaxfehler.

 cursor.execute('INSERT INTO ? VALUES (?)', ('mytable','"Jello, world!"')) >> >sqlite3.OperationalError: near "?": syntax error 

Kann der table in einer sql-Anweisung sicher und dynamisch weitergegeben werden?

  • Sqlite3 "IN" -Klausel
  • Wie kann man die Existenz einer Zeile in SQLite mit Python überprüfen?
  • Sqlite3, OperationalError: Datenbankdatei konnte nicht geöffnet werden
  • Escaping-Zeichen in Python und sqlite
  • Beim Django-facebook für DjangoApp den Befehl db_type () aufrufen
  • Python 3 SQLite3 - Falsche Anzahl von Bindungen
  • ALTER TABLE Sqlite: Wie kann man überprüfen, ob eine Spalte existiert, bevor die Tabelle geändert wird?
  • Fehlerbindungsparameter 0: wahrscheinlich nicht unterstützter Typ
  • 2 Solutions collect form web for “Ist diese Streichersubstitution bei der Erstellung von SQL-Abfragen verpönt, wie vergeben Sie den Tabellennamen dynamisch?”

    Es ist nicht die dynamische String-Substitution per-se das Problem. Seine dynamische String-Substitution mit einem vom Benutzer bereitgestellten String, der das große Problem darstellt, weil das Sie zu SQL-Injection-Attacken öffnet. Wenn Sie absolut 100% sicher sind, dass die tablename eine sichere Zeichenfolge ist, die Sie kontrollieren, dann splicing es in die SQL-Abfrage wird sicher sein.

     if some_condition(): table_name = 'TABLE_A' else: table_name = 'TABLE_B' cursor.execute('INSERT INTO '+ table_name + 'VALUES (?)', values) 

    Das heißt, mit dynamischen SQL wie das ist sicherlich ein Code-Geruch, so dass Sie überprüfen sollten, um zu sehen, ob Sie eine einfachere Alternative ohne die dynamisch generierten SQL-Strings finden können. Darüber hinaus, wenn Sie wirklich wollen, dynamische SQL dann etwas wie SQLAlchemy könnte nützlich sein, um zu garantieren, dass die SQL Sie generieren ist gut gebildet.

    Das Verfassen von SQL-Anweisungen mit String-Manipulation ist nicht nur wegen der Sicherheitsimplikationen ungerade, sondern auch, weil Strings "dumme" Objekte sind. Mit sqlalchemy Kern (Sie brauchen nicht einmal die ORM-Teil) ist fast wie mit Strings, aber jedes Fragment wird viel schlauer und ermöglichen eine leichtere Komposition. Werfen Sie einen Blick auf die sqlalchemy Wiki , um eine Vorstellung davon zu bekommen, was ich rede.

    Zum Beispiel, mit sqlsoup Ihr ​​Code würde wie folgt aussehen:

     db = SQLSoup('sqlite://yourdatabase') table = getattr(db, tablename) table.insert(fieldname='value', otherfield=123) db.commit() 

    Ein weiterer Vorteil: Code ist datenbankunabhängig – will nach Orakel ziehen? Ändern Sie die Verbindungszeichenfolge und Sie sind fertig.

    Python ist die beste Programmiersprache der Welt.