2011-05-29 61 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