2017-09-23 5 views
0

J'ai créé une base de données appelée websites2014 et trois tables cand_elec, sites, et pages sous cette base de données via Postgresql. J'essaie maintenant d'interroger la table pages et filtre par l'une de ses colonnes uuid mais cela ne fonctionne pas. Voici le code:SQLAlchemy requête/filtre ne fonctionne pas

import sqlalchemy 
from sqlalchemy import create_engine 
from sqlalchemy import Column, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy import inspect 

db_string = "postgres://usr:[email protected]:5432/websites2014" 

db = create_engine(db_string) 
Session = sessionmaker(db) 
session = Session() 

pages = session.query('pages') 

Les codes ci-dessus travail bien jusqu'à ce que la ligne suivante:

test = pages.filter_by(uuid="1234").first() 

Il ne fonctionne pas si je change le code:

test = pages.filter_by("uuid"="1234").first() 

Je suis nouveau à Postgresql et SQLAlchemy. Quelqu'un peut-il aider? Merci!


EDIT 1

Voici les nouveaux codes I RÉVISÉE:

import sqlalchemy 
from sqlalchemy import create_engine 
from sqlalchemy import Column, String 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy import inspect 

db_string = "postgres://usr:[email protected]:5432/websites2014" 

db = create_engine(db_string) 
Session = sessionmaker(db) 
session = Session() 

Base = declarative_base() 

class Page(Base): 
    __tablename__ = 'polls_question' 

    uuid = Column(String, primary_key=True) 

pages = session.query(Page) 
test = pages.filter_by(uuid=1234).first() 

Cependant, il me donne un message d'erreur: InternalError: (psycopg2.InternalError) current transaction is aborted, commands ignored until end of transaction block [SQL: 'SELECT polls_question.uuid AS polls_question_uuid \nFROM polls_question \nWHERE polls_question.uuid = %(uuid_1)s \n LIMIT %(param_1)s'] [parameters: {'uuid_1': 1234, 'param_1': 1}]

Si je change la dernière ligne : session.execute("""SELECT * from page WHERE uuid = '1234'""").first()

Il montre un autre message d'erreur comme: InternalError: (psycopg2.InternalError) current transaction is aborted, commands ignored until end of transaction block [SQL: "SELECT * from page WHERE uuid = '1234'"]

Merci encore pour l'aide!


EDIT 2

Comme les commentaires ci-dessous la réponse, si je réécris les codes comme:

class Pages(Base): 
    __tablename__ = 'pages' 

    uuid = Column(String, primary_key=True) 

donc la classe nom et le nom de table sont définis comme je définis lors de la création table. Cela devrait fonctionner et le message d'erreur disparaîtra.

Répondre

1

Vous essayez d'utiliser un objet de requête, mais il semble que vous n'avez pas créé de classe mappée pour l'instancier.

Query documentation

Mapping documentation

Vous devez déclarer une classe Page comme suit pour utiliser cet outil:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, String 
Base = declarative_base() 

class Page(Base): 
    __tablename__ = 'pages' 

    uuid = Column(String, primary_key=True) 

Il n'a pas besoin de toutes les colonnes définies dans votre table, au moins la clé primaire et les colonnes que vous utiliserez après dans le filtre, ou dans la sortie que vous voulez créer.

Ensuite, vous pouvez l'utiliser pour construire le session.query:

pages = session.query(Page) 
test = pages.filter_by(uuid="1234").first() 

Peut-être il peut être plus facile de créer une instruction simple requête SELECT?

session.execute("""SELECT * from pages WHERE uuid = '1234'""").first() 
+0

Merci pour la réponse! Cependant, je suis encore un peu confus. D'après vos codes, il me semble que même si j'ai déjà créé la table et les colonnes à l'intérieur, je dois encore les définir dans mes codes? Btw, la dernière ligne 'test = pages.filter_by (uuid =" 1234 "). First()' ne fonctionne toujours pas et j'ai mis le message d'erreur dans mon message d'origine. – tzu

+0

@Tzu désolé pour le nom de table, c'est '__tablename__ = 'page'' bien sûr – PRMoureu

+0

pourriez-vous vérifier le type de' uuid' dans votre base de données? Entier ou chaîne? – PRMoureu