2009-08-14 6 views
1

J'accède à une table postgres à l'aide de SQLAlchemy. Je veux qu'une requête ait un chargement rapide.SQLAlchemy - Essais de chargement en cours ... Erreur d'attribut

from sqlalchemy.orm import sessionmaker, scoped_session, eagerload 
from settings import DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME 
from sqlalchemy import create_engine 
from sqlalchemy import Table, Column, Integer, String, Boolean, MetaData, ForeignKey 
from sqlalchemy.orm import mapper 
from sqlalchemy.ext.declarative import declarative_base 

def create_session(): 
    engine = create_engine('postgres://%s:%[email protected]%s:%s/%s' % (DATABASE_USER, DATABASE_PASSWORD, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME), echo=True) 
    Session = scoped_session(sessionmaker(bind=engine)) 
    return Session() 

Base = declarative_base() 
class Zipcode(Base): 
    __tablename__ = 'zipcode' 
    zipcode = Column(String(6), primary_key = True, nullable=False) 
    city = Column(String(30), nullable=False) 
    state = Column(String(30), nullable=False) 

session = create_session() 
query = session.query(Zipcode).options(eagerload('zipcode')).filter(Zipcode.state.in_(['NH', 'ME'])) 
#query = session.query(Zipcode.zipcode).filter(Zipcode.state.in_(['NH', 'ME'])) 
print query.count() 

Cela échoue avec AttributeError: objet 'COLUMNPROPERTY' n'a pas d'attribut 'mappeur'

Un sans eagerloading renvoie les enregistrements correctement.

Je suis nouveau à SQLAlchemy. Je ne suis pas sûr du problème. Des pointeurs?

+0

Avez-vous un lien vers ce code de démarrage qui pourrait décrire le fonctionnement de ce code? – sAguinaga

Répondre

2

Vous pouvez uniquement charger rapidement une propriété relationnelle. Pas sur la table elle-même. Le chargement anticipé est destiné au chargement d'objets à partir d'autres tables en même temps que l'obtention d'un objet particulier. La façon dont vous chargez tous les objets pour une requête sera simplement en ajoutant tout().

query = session.query(Zipcode).options(eagerload('zipcode')).filter(Zipcode.state.in_(['NH', 'ME'])).all() 

La requête sera maintenant une liste de tous les objets (lignes) dans la table et len ​​(requête) vous donnera le nombre.

+0

Yup .. Merci j'ai mélangé .. – Ramya

Questions connexes