Comment voulez-vous échapper à cordes pour SQLite/table des noms de colonne en Python?

L'approche standard pour l'utilisation de valeurs de variables dans SQLite requêtes est le "point d'interrogation style", comme ceci:

import sqlite3
with sqlite3.connect(":memory:") as connection:
    connection.execute("CREATE TABLE foo(bar)")
    connection.execute("INSERT INTO foo(bar) VALUES (?)", ("cow",))

    print(list(connection.execute("SELECT * from foo")))
    # prints [(u'cow',)]

Toutefois, cela ne fonctionne que pour la substitution des valeurs dans les requêtes. Il échoue lorsque utilisé pour la table ou la colonne des noms:

import sqlite3
with sqlite3.connect(":memory:") as connection:
    connection.execute("CREATE TABLE foo(?)", ("bar",))
    # raises sqlite3.OperationalError: near "?": syntax error

Ni le sqlite3 module ni PEP 249 mentionner une fonction pour échapper à des noms ou des valeurs. Sans doute c'est pour décourager les utilisateurs de l'assemblage de leurs requêtes avec des chaînes, mais il me laisse à une perte.

Quelle fonction ou technique est la plus appropriée pour l'utilisation de noms de variables pour les colonnes ou de tables SQLite? J'avais la nette préférence de ne pouvoir le faire sans toutes les autres dépendances, car je vais l'utiliser dans mon propre wrapper.

J'ai cherché mais je ne pouvais pas trouver une description claire et complète de la partie pertinente de SQLite est la syntaxe à utiliser pour écrire ma propre fonction. Je veux être sûr que cela fonctionne pour n'importe quel identificateur permise par SQLite, donc un essai-et-erreur de la solution est trop aléatoire pour moi.

SQLite utilise " pour citer les identificateurs mais je ne suis pas sûr que juste échapper est suffisant. PHP fonction sqlite_escape_string fonction de la documentation suggère que certaines des données binaires peuvent avoir besoin d'être échappé, mais qui peut être un caprice de la bibliothèque PHP.

InformationsquelleAutor Jeremy | 2011-06-28