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?

  • Verwenden Sie mehrere Cursor in einer verschachtelten Schleife in sqlite3 von python-2.7
  • Fehler beim Zugriff auf die im Django erstellte Tabelle im Python-Code
  • Wie man die eingefügte ID nach dem Einfügen von Zeile in SQLite mit Python abruft?
  • Python SQLite - Wie man manuell BEGINNEN und END-Transaktionen?
  • Wie man aus sqlite3 cursor.fetchall () in python entfernen kann
  • Profil Millionen von Textdateien im Parallel mit einem Sqlite Counter?
  • Python - Update Datenbank
  • Verbinden Sie mit einer entfernten sqlite3-Datenbank mit Python
  • 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.