['ed', 'Ed Jones', 'edspassword']
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE users.name = ? ORDER BY users.oid
+ WHERE users.name = ?
LIMIT 1 OFFSET 0
['ed']
{stop}>>> our_user
A `Query` is created using the `query()` function on `Session`. This function takes a variable number of arguments, which can be any combination of classes and class-instrumented descriptors. Below, we indicate a `Query` which loads `User` instances. When evaluated in an iterative context, the list of `User` objects present is returned:
{python}
- {sql}>>> for instance in session.query(User): # doctest: +NORMALIZE_WHITESPACE
+ {sql}>>> for instance in session.query(User).order_by(User.id): # doctest: +NORMALIZE_WHITESPACE
... print instance.name, instance.fullname
SELECT users.id AS users_id, users.name AS users_name,
users.fullname AS users_fullname, users.password AS users_password
- FROM users ORDER BY users.oid
+ FROM users ORDER BY users.id
[]
{stop}ed Ed Jones
wendy Wendy Williams
... print user
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE users.name = ? AND users.fullname = ? ORDER BY users.oid
+ WHERE users.name = ? AND users.fullname = ?
['ed', 'Ed Jones']
{stop}<User('ed','Ed Jones', 'f8s7ccs')>
The `all()`, `one()`, and `first()` methods of `Query` immediately issue SQL and return a non-iterator value. `all()` returns a list:
{python}
- >>> query = session.query(User).filter(User.name.like('%ed'))
+ >>> query = session.query(User).filter(User.name.like('%ed')).order_by(User.id)
{sql}>>> query.all()
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE users.name LIKE ? ORDER BY users.oid
+ WHERE users.name LIKE ? ORDER BY users.id
['%ed']
{stop}[<User('ed','Ed Jones', 'f8s7ccs')>, <User('fred','Fred Flinstone', 'blah')>]
{sql}>>> query.first()
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE users.name LIKE ? ORDER BY users.oid
+ WHERE users.name LIKE ? ORDER BY users.id
LIMIT 1 OFFSET 0
['%ed']
{stop}<User('ed','Ed Jones', 'f8s7ccs')>
... print e
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE users.name LIKE ? ORDER BY users.oid
+ WHERE users.name LIKE ? ORDER BY users.id
LIMIT 2 OFFSET 0
['%ed']
{stop}Multiple rows returned for one()
### Using Literal SQL {@naqme=literal}
-Literal strings can be used flexibly with `Query`. Most methods accept strings in addition to SQLAlchemy clause constructs. For example, `filter()`:
+Literal strings can be used flexibly with `Query`. Most methods accept strings in addition to SQLAlchemy clause constructs. For example, `filter()` and `order_by()`:
{python}
- {sql}>>> for user in session.query(User).filter("id<224").all():
+ {sql}>>> for user in session.query(User).filter("id<224").order_by("id").all():
... print user.name
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE id<224 ORDER BY users.oid
+ WHERE id<224 ORDER BY id
[]
{stop}ed
wendy
{python}
{sql}>>> session.query(User).filter("id<:value and name=:name").\
- ... params(value=224, name='fred').one() # doctest: +NORMALIZE_WHITESPACE
+ ... params(value=224, name='fred').order_by(User.id).one() # doctest: +NORMALIZE_WHITESPACE
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE id<? and name=? ORDER BY users.oid
+ WHERE id<? and name=? ORDER BY users.id
LIMIT 2 OFFSET 0
[224, 'fred']
{stop}<User('fred','Fred Flinstone', 'blah')>
{python}
>>> from sqlalchemy import ForeignKey
- >>> from sqlalchemy.orm import relation
+ >>> from sqlalchemy.orm import relation, backref
>>> class Address(Base):
... __tablename__ = 'addresses'
... id = Column(Integer, primary_key=True)
... email_address = Column(String, nullable=False)
... user_id = Column(Integer, ForeignKey('users.id'))
...
- ... user = relation(User, backref='addresses')
+ ... user = relation(User, backref=backref('addresses', order_by=id))
...
... def __init__(self, email_address):
... self.email_address = email_address
BEGIN
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE users.name = ? ORDER BY users.oid
+ WHERE users.name = ?
LIMIT 2 OFFSET 0
['jack']
{sql}>>> jack.addresses
SELECT addresses.id AS addresses_id, addresses.email_address AS addresses_email_address, addresses.user_id AS addresses_user_id
FROM addresses
- WHERE ? = addresses.user_id ORDER BY addresses.oid
+ WHERE ? = addresses.user_id ORDER BY addresses.id
[5]
{stop}[<Address('jack@google.com')>, <Address('j25@yahoo.com')>]
addresses_1.id AS addresses_1_id, addresses_1.email_address AS addresses_1_email_address,
addresses_1.user_id AS addresses_1_user_id
FROM (SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname,
- users.password AS users_password, users.oid AS users_oid
- FROM users
- WHERE users.name = ? ORDER BY users.oid
+ users.password AS users_password
+ FROM users WHERE users.name = ?
LIMIT 2 OFFSET 0) AS anon_1 LEFT OUTER JOIN addresses AS addresses_1
- ON anon_1.users_id = addresses_1.user_id ORDER BY anon_1.oid, addresses_1.oid
+ ON anon_1.users_id = addresses_1.user_id ORDER BY addresses_1.id
['jack']
>>> jack
users.password AS users_password, addresses.id AS addresses_id,
addresses.email_address AS addresses_email_address, addresses.user_id AS addresses_user_id
FROM users, addresses
- WHERE users.id = addresses.user_id AND addresses.email_address = ? ORDER BY users.oid
+ WHERE users.id = addresses.user_id AND addresses.email_address = ?
['jack@google.com']
{stop}<User('jack','Jack Bean', 'gjffdd')> <Address('jack@google.com')>
... filter(Address.email_address=='jack@google.com').all()
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users JOIN addresses ON users.id = addresses.user_id
- WHERE addresses.email_address = ? ORDER BY users.oid
+ WHERE addresses.email_address = ?
['jack@google.com']
{stop}[<User('jack','Jack Bean', 'gjffdd')>]
... filter(Address.email_address=='jack@google.com').all()
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users JOIN addresses ON users.id = addresses.user_id
- WHERE addresses.email_address = ? ORDER BY users.oid
+ WHERE addresses.email_address = ?
['jack@google.com']
{stop}[<User('jack','Jack Bean', 'gjffdd')>]
Once we have our statement, it behaves like a `Table` construct, such as the one we created for `users` at the start of this tutorial. The columns on the statement are accessible through an attribute called `c`:
{python}
- {sql}>>> for u, count in session.query(User, stmt.c.address_count).outerjoin((stmt, User.id==stmt.c.user_id)): # doctest: +NORMALIZE_WHITESPACE
+ {sql}>>> for u, count in session.query(User, stmt.c.address_count).\
+ ... outerjoin((stmt, User.id==stmt.c.user_id)).order_by(User.id): # doctest: +NORMALIZE_WHITESPACE
... print u, count
SELECT users.id AS users_id, users.name AS users_name,
users.fullname AS users_fullname, users.password AS users_password,
anon_1.address_count AS anon_1_address_count
FROM users LEFT OUTER JOIN (SELECT addresses.user_id AS user_id, count(?) AS address_count
FROM addresses GROUP BY addresses.user_id) AS anon_1 ON users.id = anon_1.user_id
- ORDER BY users.oid
+ ORDER BY users.id
['*']
{stop}<User('ed','Ed Jones', 'f8s7ccs')> None
<User('wendy','Wendy Williams', 'foobar')> None
FROM addresses
WHERE NOT (EXISTS (SELECT 1
FROM users
- WHERE users.id = addresses.user_id AND users.name = ?)) ORDER BY addresses.oid
+ WHERE users.id = addresses.user_id AND users.name = ?))
['jack']
{stop}[]
{sql}>>> del jack.addresses[1]
SELECT addresses.id AS addresses_id, addresses.email_address AS addresses_email_address, addresses.user_id AS addresses_user_id
FROM addresses
- WHERE ? = addresses.user_id ORDER BY addresses.oid
+ WHERE ? = addresses.user_id
[5]
{stop}
{sql}>>> wendy = session.query(User).filter_by(name='wendy').one()
SELECT users.id AS users_id, users.name AS users_name, users.fullname AS users_fullname, users.password AS users_password
FROM users
- WHERE users.name = ? ORDER BY users.oid
+ WHERE users.name = ?
LIMIT 2 OFFSET 0
['wendy']
{python}
{sql}>>> session.query(BlogPost).filter(BlogPost.keywords.any(keyword='firstpost')).all()
+ INSERT INTO posts (user_id, headline, body) VALUES (?, ?, ?)
+ [2, "Wendy's Blog Post", 'This is a test']
INSERT INTO keywords (keyword) VALUES (?)
['wendy']
INSERT INTO keywords (keyword) VALUES (?)
['firstpost']
- INSERT INTO posts (user_id, headline, body) VALUES (?, ?, ?)
- [2, "Wendy's Blog Post", 'This is a test']
INSERT INTO post_keywords (post_id, keyword_id) VALUES (?, ?)
[[1, 1], [1, 2]]
SELECT posts.id AS posts_id, posts.user_id AS posts_user_id, posts.headline AS posts_headline, posts.body AS posts_body
FROM posts
WHERE EXISTS (SELECT 1
FROM post_keywords, keywords
- WHERE posts.id = post_keywords.post_id AND keywords.id = post_keywords.keyword_id AND keywords.keyword = ?) ORDER BY posts.oid
+ WHERE posts.id = post_keywords.post_id AND keywords.id = post_keywords.keyword_id AND keywords.keyword = ?)
['firstpost']
{stop}[BlogPost("Wendy's Blog Post", 'This is a test', <User('wendy','Wendy Williams', 'foobar')>)]
FROM posts
WHERE ? = posts.user_id AND (EXISTS (SELECT 1
FROM post_keywords, keywords
- WHERE posts.id = post_keywords.post_id AND keywords.id = post_keywords.keyword_id AND keywords.keyword = ?)) ORDER BY posts.oid
+ WHERE posts.id = post_keywords.post_id AND keywords.id = post_keywords.keyword_id AND keywords.keyword = ?))
[2, 'firstpost']
{stop}[BlogPost("Wendy's Blog Post", 'This is a test', <User('wendy','Wendy Williams', 'foobar')>)]
FROM posts
WHERE ? = posts.user_id AND (EXISTS (SELECT 1
FROM post_keywords, keywords
- WHERE posts.id = post_keywords.post_id AND keywords.id = post_keywords.keyword_id AND keywords.keyword = ?)) ORDER BY posts.oid
+ WHERE posts.id = post_keywords.post_id AND keywords.id = post_keywords.keyword_id AND keywords.keyword = ?))
[2, 'firstpost']
{stop}[BlogPost("Wendy's Blog Post", 'This is a test', <User('wendy','Wendy Williams', 'foobar')>)]