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

7334 ワード

前期は十分な準備をしていましたが、今は重要な内容の一つであるクエリーです.もちろん、前の文章にはクエリーに関するものが多かれ少なかれ挿入されています.例えば、クエリーオブジェクトはSessionセッションのquery()メソッドによって取得されます.このメソッドのパラメータの数は可変です.つまり、任意のパラメータの数を入力することができます.パラメータのタイプは、任意のクラスの組合せまたはクラスの名前であってもよいが、次の例では、この点を説明し、QueryオブジェクトにUserインスタンスをロードさせる.
 
  
>>> for instance in session.query(User).order_by(User.id):
...     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.id
()

ed Ed Jones
wendy Wendy Williams
mary Mary Contrary
fred Fred Flinstone

もちろん、この例では、Queryオブジェクトが反復可能なUserインスタンステーブルのセットを返すと、for in文でアクセスします.例えば、ここでは「ユーザー名」instanceを順次出力することができます.nameと「ユーザーフルネーム」instance.fullname.皆さんは後ろにあることに気づいたかもしれません.order_by(User.id)、これはSQL文と同じで、結果セットがUserを押すことを示します.idがマッピングしたテーブル列をソートします.
「ユーザ名」と「ユーザフルネーム」だけが必要で、オブジェクトインスタンスの他の属性に興味がない場合は、それら(クラスの属性名)を直接問い合わせることもできます.もちろん、ここでは、このクラスがORMマッピングでなければならないことを前提としています.任意の数のクラスエンティティまたは列ベースのエンティティは、query()メソッドのパラメータとして使用できます.もちろん、最終的にQueryオブジェクトはメタグループタイプを返します.
 
  
>>> for name, fullname in session.query(User.name, User.fullname):
...     print name, 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オブジェクトとみなされ、属性名の帰属名、タイプ名の帰型名、たとえば次の例です.
 
  
>>> for row in 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
wendy
mary
fred

もちろん、label()メソッドで個別のカラム式名を変更するなど、パーソナライズすることもできます.もちろん、このメソッドは、エンティティ・テーブルにマッピングされたカラム要素オブジェクト(ColumnElement-derived)にのみ存在します(User.nameなど):
 
  
>>> for row in session.query(User.name.label('name_label')).all():
...    print(row.name_label)
SELECT users.name AS name_label
FROM users
()

ed
wendy
mary
fred

クエリー・オブジェクト・インスタンスでは、テーブル接続操作などのクエリー・オブジェクトのquery()のパラメータとしてこのエンティティ・クラス名を複数回使用する場合、「別名」を付けて、別名でパラメータを入力できます.
 
  
>>> from sqlalchemy.orm import aliased
>>> user_alias = aliased(User, name='user_alias')

>>> for row in 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
()





MySQLなどのデータベースを学んだことがある人はLIMITとOFFSETの2つのSQL操作を知っているかもしれませんが、これは記録の数と位置をコントロールするのに便利で、データのページング操作によく使われています.もちろん、SQLAlchemyのQueryオブジェクトは私たちに考えてくれました.Python配列スライスで簡単に実現できます.この操作はORDER BYと一緒によく使われています.
 
  
>>> for u in 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 ? OFFSET ?
(2, 1)



特定の結果をフィルタリングする必要がある場合はfilter_を使用します.by()メソッド、このメソッドはキーワードパラメータを使用します:
 
  
>>> for name, in session.query(User.name).\
...             filter_by(fullname='Ed Jones'):
...    print name
SELECT users.name AS users_name FROM users
WHERE users.fullname = ?
('Ed Jones',)

ed

あるいはfilter()を使用しても目的を達成できますが、SQL文のようなより柔軟な式構造を使用していることに注意してください.これは、比較操作など、Python自身のオペレータを内部で使用できることを意味します.
 
  
>>> for name, in session.query(User.name).\
...             filter(User.fullname=='Ed Jones'):
...    print name
SELECT users.name AS users_name FROM users
WHERE users.fullname = ?
('Ed Jones',)

ed

ここのUserに注意してください.fullname='Ed Jones'は、Ed Jonesに等しい操作を比較してフィルタします.
もちろん、強力なQueryオブジェクトには便利な特性があります.それは直列に接続できることです.これは、Queryオブジェクトの各ステップの操作がQueryオブジェクトを返すことを意味します.同じ方法を直列に接続して式構造を形成することができます.ユーザー名が「ed」で、「Ed Jones」とフルネームのユーザーを検索すると、filter()を2回直接直列に呼び出し、SQL文のAND接続を表すことができます.
 
  
>>> for user in session.query(User).\
...          filter(User.name=='ed').\
...          filter(User.fullname=='Ed Jones'):
...    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 = ?
('ed', 'Ed Jones')


フィルタ()を使用する一般的なフィルタ処理を以下に示します.
1.等しい

   query.filter(User.name == 'ed') 
 

2.等しくない

   query.filter(User.name != 'ed') 
 

3. LIKE

   query.filter(User.name.like('%ed%')) 
 

4. IN
 
  
query.filter(User.name.in_(['ed', 'wendy', 'jack']))

# works with query objects too:

query.filter(User.name.in_(session.query(User.name).filter(User.name.like('%ed%'))))

5. NOT IN

   query.filter(~User.name.in_(['ed', 'wendy', 'jack'])) 
 

6. IS NULL

   filter(User.name == None) 
 

7. IS NOT NULL

   filter(User.name != None) 
 

8. AND
 
  
from sqlalchemy import and_
filter(and_(User.name == 'ed', User.fullname == 'Ed Jones'))

# or call filter()/filter_by() multiple times
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 contents of the match parameter are database backend specific.」この操作の意味がよくわかりません)
はい、今日はこれだけ紹介します.基本的に下手な翻訳ですが、皆さんに助けてほしいです.