2012-05-27 32 views
4

我試圖從mysql中加載用戶對象,但我一直在收到UnboundExecutionError:找不到在映射器Mapper | UserDo |用戶,SQL表達式或此會話上配置的綁定。我使用的是經典映射。找不到在映射器上使用經典映射配置的綁定

Base = declarative_base() 

# A default constructor is created if one is not already present, 
# which accepts keyword arguments of the same name as that of the mapped attributes. 

class UserDo(Base): 
    __tablename__ = 'user' 

    id = Column(Integer, primary_key = True) 
    fname = Column(String(100)) 
    lname = Column(String(100)) 
    email = Column(String(200)) 
    salt = Column(String(100)) 
    created_on = Column(TIMESTAMP) # from sqlalchemy.dialects.mysql import TIMESTAMP 

class BaseService(object): 

    def __init__(self): 
     self._engine = create_engine('mysql://[email protected]/my_db', pool_recycle = 3600) 
     self._Session = sessionmaker(bind = self._engine) 
     self._session = Session() 

class UserService(BaseService): 

    def create(self, data): 
     print self._session.query(UserDo).first() # Error 

我想知道是否因爲我的create_engine語句而出現錯誤。也許我沒有提供正確的連接格式。我的本地數據庫沒有密碼。

而且,別的,我注意到: 打印self._session.query(UserDo)

打印選擇 「用戶」 .ID AS USER_ID, 「用戶」 .fname AS user_fname, 「用戶」 .lname AS user_lname,「user」.email AS user_email,「user」.salt AS user_salt,「user」.created_on AS user_created_on FROM「user」

這是一個語法錯誤。無論哪種方式,我不關心SQLAlchemy在內部做了什麼,只要做User.fname,User.lname(etc),按照定義工作。

任何人看到發生了什麼?

回答

4

出於某種原因,SQLAlchemy的0.8不喜歡它,當我做到這一點(創建實例變量):

class BaseService(object): 

    def __init__(self): 
     self._engine = create_engine('mysql://[email protected]/my_db', pool_recycle = 3600) 
     self._Session = sessionmaker(bind = self._engine) 
     self._session = Session() 

此修復程序是讓他們靜而不是:

class BaseService(object): 
    engine = create_engine('mysql://[email protected]/my_db', pool_recycle = 3600) 
    Session = sessionmaker(bind = engine) 
    session = Session() 

然後你就可以做:

class UserService(BaseService): 

    def create(self, data): 
     BaseService.session.query(UserDo).first() 
+0

雖然這解決了手頭的問題,我不知道是否有人知道它爲什麼有效? – Thornhale