SQLAlchemy でテーブルからデータを選択する
ここまで順調です! いよいよ SQLAlchemy を使って最初の SELECT 文を作成していきます。SQLAlchemy は、データベースとやり取りするための「Python らしい」便利な方法を提供します。前の演習では生の SQL を使ってデータベースに直接クエリを投げましたが、SQLAlchemy を使う場合は代わりに Table オブジェクト経由で操作し、SQLAlchemy が適切な SQL 文に翻訳してくれます。そのため、MySQL や PostgreSQL など従来の SQL の方言ごとの違いを意識するのではなく、SQLAlchemy の Pythonic なフレームワークを活用して、ワークフローを簡素化し、より効率的にデータへクエリできます。こうした理由から、すでに従来の SQL に慣れている方にとっても学ぶ価値があります。
この演習では、再び census テーブルから全レコードを取得するステートメントを組み立てます。今回は、sqlalchemy モジュールの select() 関数を使います。この関数は、必須引数としてテーブルまたは列のリストを 1 つだけ受け取ります(例: select([my_table]))。
さらに、.fetchmany() に size 引数を指定して、ResultProxy から一部のレコードだけを取得します。
Table と MetaData はすでにインポート済みです。メタデータは metadata、データベースへの接続は connection として利用できます。
この演習はコースの一部です
Pythonで学ぶデータベース入門
演習の手順
sqlalchemyモジュールからselectをインポートします。censusテーブルをリフレクトします。このコードはすでに用意されています。select()関数を使って、censusテーブル内の全レコードを取得するクエリを作成します。これには、select()にcensusを唯一の要素とするリストを渡します。- 実際に生成される SQL クエリを確認するために
stmtを出力します。このコードは用意済みです。 censusテーブルから 10 件のレコードを取得し、resultsに保存します。次の手順で行います。connectionの.execute()メソッドにstmtを渡して ResultProxy を取得します。connection.execute(stmt)に対して適切なsize引数を指定して.fetchmany()を使い、ResultSet を取得します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Import select
from ____ import ____
# Reflect census table via engine: census
census = Table('census', metadata, autoload=True, autoload_with=engine)
# Build select statement for census table: stmt
stmt = ____
# Print the emitted statement to see the SQL string
print(stmt)
# Execute the statement on connection and fetch 10 records: result
results = ____.____(____).____(size=___)
# Execute the statement and print the results
print(results)