8
votes

Python, mysqldb et les noms de table qui échappent?

Je manque peut-être quelque chose d'évident, mais je ne peux pas comprendre comment mon code est différent de divers exemples que je vois dans la documentation en ligne de mysqldb.

Je suis assez nouveau à la programmation de Python, plus expérimenté avec Perl . Ce que j'essaye de faire est de faire de certaines bonnes habitudes tôt (comme à Perl, je commence toujours par «utilisation stricte; des avertissements d'utilisation»), donc j'essaie de vous assurer que je crée des fonctions réutilisables dans un fichier indépendant ( Funct.py) Pour me sauver Temps plus tard sur la ligne. P>

J'ai cette fonction pour sélectionner des lignes aléatoires à partir d'une table: p> xxx pré>

Il est appelé comme ceci: p> xxx pré>

malheureusement, il est erroné avec: _MYSQL_Exceptions.ProgrammingError: (1064, "Vous avez une erreur dans votre syntaxe SQL; Vérifiez le manuel correspondant à votre version de Server MySQL pour la bonne syntaxe à utiliser à proximité '' TestTable '' 'à la ligne 1") p>

Si je mettais un test de test à la place du% S sur la ligne d'exécution, la requête fonctionnera, mais elle ressemble à une exécution p> xxx pré>

ce qui rend bien sûr "ID". P>

donné à la fois de ceux dont il ressemble à citer les entrées% s lorsqu'il essaie de les exécuter. Je me demandais si quelqu'un pouvait expliquer comment je l'obtiens pour arrêter de faire cela, ou comment je devrais réellement faire ce que j'essaie d'atteindre? Je veux que la fonction soit aussi générique que possible, ce qui s'appuie sur des données qui lui sont transmises lorsqu'il est appelé. P>

Edit: je devrais ajouter, si je me substitue? Marques: P>

....
    cursor.execute('SELECT MAX(?) FROM ?',(countcol,table))
File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 151, in execute
    query = query % db.literal(args)
TypeError: not all arguments converted during string formatting


0 commentaires

3 Réponses :


2
votes

Vous ne pouvez pas utiliser dB-API pour les métadonnées; Vous devrez vous remplacer en dehors de l'appel exécuté () appel. xxx

évidemment, vous ne devez pas faire cela si Table vient de une source extérieure.


1 commentaires

C'est idéalement ce que j'essaie d'éviter. J'ai déjà réalisé une fonction de format similaire, mais je voudrais le faire un peu plus sûr.



0
votes

mysqldb cite probablement vos noms de table avec des guillemets simples au lieu de backticks. Essayez ceci xxx


2 commentaires

Non, cela échoue aussi, toujours à la recherche de la base de données.Table '!


Cette réponse est fondamentalement la même chose que @ Ignacio's. Je ne sais pas comment vous pourriez vous retrouver avec des citations. Avez-vous tapé des backticks autour de % s à la fin de la chaîne citée?



-1
votes

intéressant. Mais dans le manuel Il y a quelques exemples. Peut-être que c'est quelque chose de similaire. XXX

Dans cet exemple, max_price = 5 Pourquoi, alors, utilisez% s dans la chaîne? Étant donné que MySQLDB le convertira à une valeur littérale SQL, qui est la chaîne '5'. Quand c'est fini, la requête dira réellement: "... Où prix <5".

et xxx

Ici, nous insérons trois rangées de cinq valeurs. Notez qu'il y a Un mélange de types (chaînes, intens, flotteurs), bien que nous n'utilisons toujours que% s. Et notez également que nous avons seulement inclus les chaînes de format pour une ligne. MySQLDB les choisit et les duplique pour chaque rangée.


1 commentaires

Le problème est de s'échapper des noms de table, pas des valeurs de colonne.