【问题标题】:SQLAlchemy SELECT confusionSQLAlchemy SELECT 混淆
【发布时间】:2011-09-04 04:48:32
【问题描述】:

我正在浏览this SQLAlchemy tutorial 并且对以下示例(大约在页面的一半)感到非常困惑:

>>> 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, wendy@aol.com',)]

(users.c.fullname + ", " + addresses.c.email_address) 如何识别要从中选择的列 - 这是否意味着它会查找标题为 "fullname, email_address" 的列?我显然误解了一些东西。结果 [(u'Wendy Williams, wendy@aol.com',)] 与提供给 SELECT 的字符串格式相同。我只是不明白它是如何工作的。

以前从未做过数据库;我在学习 SQL 的同时也在学习 SQLAlchemy,所以我的问题完全有可能是 SQL 而不是 SQLAlchemy。

【问题讨论】:

    标签: sql select sqlalchemy


    【解决方案1】:

    users.c.fullname 是一个聪明的对象,它重载了+ 运算符。 users.c.fullname + ", " 创建一个 ClauseElement 表示表达式,SQLAlchemy 知道如何将其转换为任何 SQL 引擎的语法。同样的原因你可以做users.c.name.between('m', 'z'); users.c.name 是一个带有 between 方法的对象,该方法返回 ClauseElement

    【讨论】:

    • 是的,所以它似乎翻译成SELECT users.fullname || ', ' || addresses.email_address AS title ...,它说'||'是连接运算符。所以这意味着它搜索“全名,电子邮件地址”,对吗?这让我很困惑,因为没有一列有这个标题
    • 您将字符串与列混淆了。 users.fullname 不在引号中,因此它是列引用,使用 users 表中的 fullname 的值。查看示例底部的返回值:它是来自fullname 列的值,加上文字逗号和空格,再加上来自email_address 列的值。
    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 2014-09-20
    • 2012-11-19
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    相关资源
    最近更新 更多