>>> たとえば、session.query(User) .order_by( User.id):
... インスタンス名、インスタンス名を出力
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.id
()
ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone
もちろん、この例を通じて、Query オブジェクトが一連の反復可能な User インスタンス テーブルを返し、for in ステートメントを通じてそれにアクセスすることがわかります。たとえば、ここでは「user name」instance.name を出力できます。および「ユーザーのフルネーム」の順。最後に .order_by(User.id) があることに気づくかもしれません。これは SQL ステートメントと同じで、User.id によってマップされたテーブル列によって結果セットを並べ替えるよう指示します。
オブジェクト インスタンスの他の属性に興味がない場合は、「ユーザー名」と「ユーザーのフルネーム」のみが必要であるとします。もちろん、ここでの前提条件は次のとおりです。 ORM によってマップされると、いつでも任意の数のクラス エンティティまたは列ベースのエンティティを query() メソッドのパラメータとして使用でき、もちろん最終的な Query オブジェクトはタプル タイプを返します。
コードをコピー コードは次のとおりです。
>>> session.query の名前、フルネーム( User.name , User.fullname):
... 名前、フルネームを表示
SELECT users.name AS users_name,
users.fullname AS users_fullname
FROM users
()
ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone
返されたタプル型は、通常の Python オブジェクトとみなすこともできます。属性名と型。名前は次の例のように型名に属します。
コードをコピーします。 コードは次のとおりです。
>>> session.query(User, User.name).all() の行:
... print row.User, row.name
SELECT users.id AS users_id,
users.name AS users_name,
users.fullname AS users_fullname,
users.password AS users_password
FROM users
()
ed
<ユーザー('ウェンディ','ウェンディ ウィリアムズ', 'foobar')>ウェンディ
<ユーザー('メアリー',' Mary Contrary', 'xxg527')> mary
fred
もちろん、次のようなカスタマイズも可能です。 label() メソッドを使用して別の列式の名前を変更する場合と同様です。もちろん、このメソッドはエンティティ テーブル (User.name など) にマップされた列要素オブジェクト (ColumnElement 派生) にのみ存在します:
コードをコピー コードは次のとおりです: session.query(User.name.label('name_label) の行の
>>> ')).all():
... print(row.name_label)
SELECT users.name AS name_label
FROM users
()
ed
ウェンディ
mary
fred
クエリ オブジェクトを確認する前に インスタンスはエンティティ クラスのフル ネーム (User) をパラメータとして複数回使用する必要があるとします。クエリ オブジェクト (テーブル接続操作など) の query() を実行し、それに「エイリアス」を指定すると、エイリアスを介してパラメータを渡すことができます:
コードをコピーします コードは次のとおりです:
>>> sqlalchemy.orm からエイリアスをインポート
>>> user_alias = aliased(User, name='user_alias')
>>> ; session.query(user_alias, user_alias.name).all() の行:
... print row.user_alias
SELECT user_alias.id AS user_alias_id,
user_alias.name AS user_alias_name,
user_alias.fullname AS user_alias_fullname,
user_alias.password AS user_alias_password
FROM users AS user_alias
()
<ユーザー('ウェンディ','ウェンディ・ウィリアムズ', 'foobar')>
<ユーザー('メアリー','メアリー・コントラリー', 'xxg527')>
< ;User('fred','Fred Flinstone', 'blah')>
MySQL などのデータベースを学習したことのある学生は、LIMIT と OFFSET という 2 つの SQL 操作を知っているかもしれません。レコードの数と位置を制御します。これはデータのページング操作によく使用されます。もちろん、SQLAlchemy の Query オブジェクトはこの種の操作をすでに考えており、Python の配列スライスを通じて簡単に実装できます。 ORDER BY と一緒に使用します:
コードをコピー コードは次のとおりです:
>>> session.query(User) .order_by(User.id)[1:3]:
... print u
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.id
LIMIT ?
(2, 1)
特定の結果をフィルタリングする必要がある場合は、 filter_by() メソッドを使用できます。このメソッドはキーワード パラメータを使用します:
コードをコピー コードは次のとおりです:
> ;>> 名前、session.query(User.name).
... filter_by(fullname='Ed Jones'):
... 名前を出力
SELECT users.name AS users_name FROM users
WHERE users.fullname = ?
('Ed Jones',)
ed
または filter() を使用することでも目的を達成できますが、そうする必要があります。より柔軟な SQL のようなステートメントの式構造を使用していることに注意してください。つまり、比較演算などの Python 独自の演算子を内部で使用できます。
コードをコピー コードは次のとおりです:
>>> session.query(User.name).
... filter(User.fullname=='Ed Jones '):
... 名前を表示
SELECT users.name AS users_name FROM users
WHERE users.fullname = ?
('Ed Jones',)
ed
ここでのユーザーの fullname=='Ed Jones' に注意してください。比較演算が Ed Jones と等しい場合にのみフィルターされます。
もちろん、強力な Query オブジェクトには、連結できるという非常に便利な機能があります。つまり、Query オブジェクトに対する操作の各ステップで Query オブジェクトが返され、同じメソッドを連結することができます。式を形成するために、ユーザー名「ed」とフルネーム「Ed Jones」を使用してユーザーにクエリを実行する場合は、filter() を連続して 2 回直接呼び出すことができます。これは、SQL ステートメントの AND 接続を表します。 🎜>
コードをコピー コードは次のとおりです: session.query(User) のユーザーの>。
... filter(User .name=='ed').
... filter(User.fullname=='Ed Jones'):
... ユーザーを表示
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 = ? ?
('ed', 'Ed Jones')
以下は一般的なものですfilter() を使用したフィルタリング操作:
1. 等価
コードをコピーします コードは次のとおりです:query.filter(User.name == 'ed' )
2. 等しくない
コードをコピー コードは次のとおりです:query.filter(User.name) != 'ed')
3. LIKE
コードをコピーします コードは次のとおりです:query.filter (ユーザー名.like('% ed%'))
4. IN
コードをコピーします コードは次のとおりです:
query.filter(User.name.in_ ([' ed', 'wendy', 'jack']))
# クエリ オブジェクトでも動作します:
query.filter(User.name.in_(session.query(User .name) .filter(User.name.like('%ed%'))))
5. 中にはありません
コードをコピーします コードは次のとおりです:
query.filter(~User.name.in_(['ed', 'wendy', 'jack']))
6. 🎜>
コードをコピーします コードは次のとおりです:filter(User.name == None)
7. NULL
コードをコピー コードは次のとおりです:filter(User.name != None)
8. AND
コードをコピー コードは次のとおりです:from sqlalchemy import and_
filter(and_(User.name == 'ed', User.fullname == 'Ed Jones' ))
# または、filter()/filter_by() を複数回呼び出します
filter(User.name == 'ed')。 filter(User.fullname == 'Ed Jones')
9. OR
コードをコピー コードは次のとおりです: from sqlalchemy import or_
filter(or_(User .name == 'ed', User.name == 'wendy'))
10. 一致
コードをコピー コードは次のとおりです: query.filter(User.name.match('wendy'))
match() パラメータの内容はデータベースの背景によって指定されます。 (注: 原文は「The content of the matchparameters are database backend specific.」となっており、この操作の意味がよくわかりません)
今日はこれで終わりです。基本的には拙い翻訳です。