SQLAlchemy ВЫБЕРИТЕ путаницу - PullRequest
0 голосов
/ 29 мая 2011

Я прохожу это руководство по SQLAlchemy и очень запутался в следующем примере (примерно на полпути вниз по странице):

>>> 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. Я просто не понимаю, как это работает.

Никогда не делал базы данных раньше; Я изучаю SQLAlchemy одновременно с изучением SQL, поэтому вполне возможно, что моя проблема с SQL, а не с SQLAlchemy.

1 Ответ

0 голосов
/ 29 мая 2011

users.c.fullname - это умный объект, который перегружает оператор +. users.c.fullname + ", " создает ClauseElement, представляющее выражение, которое SQLAlchemy знает, как преобразовать в синтаксис любого механизма SQL. По той же причине, по которой вы можете сделать users.c.name.between('m', 'z'); users.c.name - это объект с between методом, который возвращает ClauseElement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...