2014-04-28 58 views
2

我下面的SQLAlchemy的教程http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.htmlSQLAlchemy的from_statement()找不到列

儘管如此,而不是使用SQLite的後端,我使用MySQL。問題是,當我嘗試執行字面MySQL的語句來選擇從用戶表中的列,如

SELECT name from users; 

會而做

SELECT * FROM users 
失敗,

NoSuchColumnError: "Could not locate column in row for column 'users.id'" 

將工作得很好。 我錯過了什麼嗎?

class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    name = Column(String(50)) 
    fullname = Column(String(50)) 
    password = Column(String(50)) 
    def __repr__(self): 
     return "<User(name='%s', fullname='%s', password='%s')>" % (self.name, self.fullname, self.password) 

的會話被定義爲:

爲用戶定義類

Session = sessionmaker(bind=engine) 
session = Session() 

,我試圖做

session.query(Users).from_statement('SELECT name from users') 

順便說一句,這句話在MySQL客戶端上運行時工作正常。 我錯過了什麼,或者它是一個錯誤?

+0

作爲一個額外的細節,「SELECT id FROM users」不會失敗,但它不會返回預期的(id列表),但是所有的列,只要它做了「SELECT * FROM用戶「 – fenomenoxp

+0

絕對不是一個錯誤。當你查詢一個對象時(就像你在'query(User)'中做的那樣),ORM必須有一個primary_key列來標識對象。這就是爲什麼它需要一個「id」列。當你僅選擇'id'列時,它仍然會返回'User'的實例,並且一旦你訪問了它的其他屬性,它就會發出另一個SQL語句來加載每個用戶的其他列。 – van

回答

3

如果有人遇到同樣的問題,我會回答自己。語法

session.query(Users).from_statement('SELECT name from users') 

是錯誤的。它應該是

session.query('name').from_statement('SELECT name from users') 

列的列表應該在對query()的調用中。