ホームページ  >  記事  >  バックエンド開発  >  Python ORM フレームワーク SQLAlchemy の学習ノート データ クエリの例

Python ORM フレームワーク SQLAlchemy の学習ノート データ クエリの例

WBOY
WBOYオリジナル
2016-06-16 08:43:481355ブラウズ

初期段階で十分な準備を行ったので、重要なコンテンツの 1 つであるクエリを実行します。もちろん、これまでの記事にはクエリに関する内容が多少なりとも散りばめられています。 Query) オブジェクトは、セッションの query() メソッドから取得されたセッションを介して渡されます。このメソッドのパラメーターの数は可変であることに注意してください。つまり、パラメーターの型をいくつでも渡すことができます。クラスまたはクラスの名前の任意の組み合わせを指定できます。次の例では、この点を示しています。Query オブジェクトに User インスタンスをロードさせます。

コードをコピー コードは次のとおりです。

>>> たとえば、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.」となっており、この操作の意味がよくわかりません)
今日はこれで終わりです。基本的には拙い翻訳です。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。