2011-05-29 84 views
0

我經歷this SQLAlchemy tutorial,並通過下面的例子顯得非常混亂(約網頁下半部):SQLAlchemy的SELECT混亂

>>> s = select([(users.c.fullname + ", " + addresses.c.email_address).label('title')], 
...  and_(
...   users.c.id==addresses.c.user_id, 
...   users.c.name.between('m', 'z'), 
...   or_(
...    addresses.c.email_address.like('%@aol.com'), 
...    addresses.c.email_address.like('%@msn.com') 
...   ) 
...  ) 
... ) 
>>> print conn.execute(s).fetchall() 
SELECT users.fullname || ? || addresses.email_address AS title 
FROM users, addresses 
WHERE users.id = addresses.user_id AND users.name BETWEEN ? AND ? AND 
(addresses.email_address LIKE ? OR addresses.email_address LIKE ?) 
(', ', 'm', 'z', '%@aol.com', '%@msn.com') 
[(u'Wendy Williams, [email protected]',)] 

如何(users.c.fullname + ", " + addresses.c.email_address)標識列選擇from--不說意味着它尋找名爲"fullname, email_address"的專欄?我顯然是誤解了一些東西。結果[(u'Wendy Williams, [email protected]',)]是與給予SELECT的字符串相同的格式。我只是不明白這是如何工作的。

以前從未做過數據庫;我在學習SQL的同時學習SQLAlchemy,所以完全有可能我的問題是使用SQL而不使用SQLAlchemy。

回答

0

users.c.fullname是一個聰明的對象,它重載了+運算符。 users.c.fullname + ", "創建表示該表達式的ClauseElement,SQLAlchemy知道如何轉換爲任何SQL引擎的語法。同樣的理由你可以做users.c.name.between('m', 'z'); users.c.name是帶有返回ClauseElementbetween方法的對象。

+0

是的,所以它似乎翻譯成'SELECT users.fullname || ','|| addresses.email_address AS title ...',它表示'||'是連接運算符。所以這意味着它搜索''fullname,email_address''',對吧?這讓我感到困惑,因爲沒有任何列具有該標題 – 2011-05-29 13:51:53

+0

您將字符串與列混淆在一起。 'users.fullname'不在引號中,所以它是一個列引用,使用'users'表中的'fullname'的值。查看示例底部的返回值:它是來自'fullname'列的值,加上文字的逗號和空格,再加上'email_address'列的值。 – Eevee 2011-05-30 00:59:00

+0

明白了,謝謝 – 2011-05-30 01:19:22