J'exécute ActiveState ActivePyThon 2.6.5.12 et PostgreSQL 9.0 Beta 1 sous Windows XP. P>
Si je crée une table avec une première lettre majuscule (c.-à-d. Livres), Psycopg2 renvoie l'erreur "Erreur de programmation: Relation" Livres "n'existe pas" Message d'erreur lorsque j'exécute l'instruction SELECT: Les tables sont-elles censées avoir un prénom en minuscule? Est-ce un paramètre ou une fonctionnalité ou un bug? Est-ce que je manque quelque chose d'évident? P> Exécuter ("Sélectionner * Des livres ") code>. La même erreur est renvoyée si j'exécute: exécuté ("SELECT * des livres") code>. Cependant, si je change le tableau en un nom minuscule (c'est-à-dire des livres), alors l'une des affirmations ci-dessus fonctionne. P>
3 Réponses :
Lire "Identificateurs et mots clés " du manuel, en particulier la partie des" identifiants cités ". P>
Huzzah! Donc, "EXECUTE (" SELECT * à partir de "LIVRES" ") fonctionne. Et puisque je capitalise également mes noms de colonne, je dois utiliser" EXECUTE ("Sélectionnez" Titre "dans" Livres "). Est-ce la méthode "standard" ou acceptée pour toujours utiliser des noms d'étuis plus faibles et des noms de champs dans les bases de données PostgreSQL?
Écrire tous les identificateurs en minuscule (et la séparation des mots avec un soulignement) est une sorte de convention, principalement pour la commodité. En ce qui concerne le "pliage de cas" par l'analyseur - la norme SQL dicte un tel comportement (avec une différence - lorsqu'il est inclus les identificateurs sont pliés en majuscules).
Citer des identifiants est quelque chose que les développeurs MSSQL semblent avoir un penchant pour. Mais la plupart des autres développeurs de base de données ont tendance à ne pas faire cela. Si vous ne citez pas les identificateurs lors de la création des tables, des vues, des fonctions, vous n'avez pas à vous soucier de les citer plus tard. Si vous ne citez pas, Postgres se pliera à des minuscules pendant que Oracle sera en majuscule.
Juste pour ajouter à ce que Scott a dit: la solution consiste à placer une table sensible à la casse ou un nom de colonne dans des guillemets. (Utilisez les citations de Python dans les devis idée) ceci si pour ceux d'entre vous qui ne savent pas ce qu'est un identifiant. (comme moi :)
Pour ajouter à l'autre réponse, le comportement de POSTRESQL à propos de la sensibilité à la cause des identifiants (noms de table et noms de colonne) est:
Ceci s'applique non seulement aux requêtes, mais aussi pour la manipulation de schéma; en particulier: création de table. P>
La règle d'or est la cohérence : p>
Si vous souhaitez écrire des applications portables, il est conseillé de toujours citer un nom particulier ou ne jamais citer celui-ci p> BlockQuote>
Le problème posté est apparu, probablement parce que les tables et les noms de colonnes ont été cités au moment de la création (par conséquent, ils n'ont pas été convertis en minuscule). Donc, maintenant, ils doivent être cités (et sensible à la casse) dans toutes les questions. p>
normalement, tous fonctionne comme prévu. p>
xxx pré> p>
Je dois souvent utiliser psycopg2 avec des tables créées par d'autres personnes et utilisent beaucoup de cas de mélange dans leurs noms de colonne.
La solution que j'ai trouvée est d'utiliser P>
data = AsIs(column_name) sql = "select %s from table" cur.execute(sql,data)
Le titre ne devrait-il pas dire "psycopg2 n'aime pas les noms de table commençant par une lettre i> majuscule i>"?