2020/05/20

Python Developers Survey 2019 の調査結果

Python Software Foundation と JetBrains の Python 利用調査 2019


Python Software Foundation と JetBrains が毎年行っている Python 利用状況調査の 2019 年版の調査結果が先日公表されました。
 

調査には 47,000 人以上もの人が回答したそうです。

Python に興味がある人にはとてもおもしろい内容なので、まだチェックしていない人はぜひチェックしてみてください。前年との比較もできるようになっているので、 Python の最新のトレンドがよくわかります。  

調査結果は見やすく図表にまとめられているので直接上の調査結果のページをご覧いただくとよいと思います。英語が苦手な方のためにどんな質問項目が並んでいるのか意訳であげておくので参考にしてください(ヌケモレがあればごめんなさい):

 
  • 全般的な Python の使用状況
    • Python はメイン言語?サブ言語?
    • Python と他の言語の使用状況は?
    • ウェブとデータサイエンスで使う言語は?
  • Python の使用目的
    • Python を使う主な目的は何?
    • Python をどんなことに使っている?
    • 以下の活動にどのくらい関わっている?
    • Python を何のために使うことが最も多い?
    • データ分析とマシンラーニングを行っている人が自分のことをデータサイエンティストだと考えているか?
  • Python のバージョン
    • Python 3 と Python 2 どちらを使っている?
    • Python のバージョンごとのユースケースは?
    • 使用する Python 3 のバージョンは?
    • Python のインストール・アップグレードの方法は?
    • Python 環境の隔離方法は?
  • フレームワークとライブラリ
    • ウェブフレームワークは何を使っている?
    • データサイエンスのフレームワークとライブラリは何を使っている?
    • ビッグデータツールは何を使っている?
    • その他のフレームワークとライブラリは何を使っている?
    • ユニットテスト用フレームワークは何を使っている?
  • 技術とクラウド
    • ORM ライブラリは何を使っている?
    • データベースは何を使っている?
    • クラウドプラットフォームは何を使っている?
    • クラウドでどのようにコードを実行している?(本番環境)
    • クラウドのための開発はどのようにしている?
  • 開発ツール
    • OS は何を使っている?
    • CI (継続的インテグレーション)システムは何を使っている?
    • 構成管理ツールは何を使っている?
    • エディタと IDE は何を使っている?
    • Python 開発に利用しているツールと機能は?
  • 雇用と働き方
    • 雇用状況は?
    • 肩書きは?
    • Python の経験はどのくらい?
    • プロフェッショナルなコーディング経験はどのくらい?
    • チームでの仕事?単独での仕事?
    • 複数のプロジェクトで働いている?
    • チームのサイズは?
    • 会社のサイズは?
    • 会社の業界は?
    • 会社のターゲット業界は?
    • 年齢層は?

オリジナルはこちらです。
   
  • General Python Usage
    • Python as main vs secondary language
    • Python usage with other languages
    • Languages for Web and Data Science
  • Purposes for Using Python
    • For what purposes do you mainly use Python?
    • What do you use Python for?
    • To what extent are you involved in the following activities?
    • What do you use Python for the most?
    • Do those involved in data analysis or machine learning consider themselves data scientists?
  • Python versions
    • Python 3 vs Python 2
    • Python versions’ use cases
    • Python 3 versions
    • Python installation and upgrade
    • Python environment isolation
  • Frameworks and Libraries
    • Web frameworks
    • Data science frameworks and libraries
    • Big Data tools
    • Other frameworks and libraries
    • Unit-testing frameworks
  • Technologies and Cloud
    • ORMs
    • Databases
    • Top Cloud platforms
    • How do you run code in the cloud (in the production environment)
    • How do you develop for the cloud?
  • Development Tools
    • Operating systems
    • Continuous Integration (CI) systems
    • Configuration Management tools
    • Editors and IDEs
    • Tools and features for Python development
  • Employment and Work
    • Employment status
    • Job roles
    • Python experience
    • Professional coding experience
    • Working in a team vs working independently
    • Working on multiple projects
    • Team size
    • Company size
    • Company industry
    • Target industry
    • Age range

以下、私の個人的な注目ポイントにコメントしていきます。
   

Python をどんなことに使っている? ― What do you use Python for?

1 位「データ分析」 58% 、 2 位「ウェブ開発」 49% 、3 位「 DevOps ・システム管理・自動化スクリプト」 39% で、その後「マシンラーニング」「ウェブパーサー・スクレイパー・クローラー」が続きます。  

データ分析とマシンラーニングでよく使われているところもそうですし、幅広い用途で使われているところなんかは Python ならではな感じですね。用途の広さとかんたんさという点では現状対抗馬がいなさそうなので今後も Python 人気は続くかと思います。
   

Python を何のために使うことが最も多い? ― What do you use Python for the most?

1 位は「ウェブ開発」で 26% (昨年対比 -1pt )です。

日本では Python といえばプログラミング入門やデータ分析・マシンラーニングのイメージが強いですが(例えば日本では Python 書籍は数年前から増えてきましたが Django や Flask の書籍が少ないです)、世界的には Python でウェブ開発をするのは結構多いようです。
   

Python 3 と Python 2 どちらを使っている? ― Python 3 vs Python 2

調査の時点でサポート終了間近の Python 2 を使っている人がまだ 10% もいます。

私は Python 2 を使う機会はもうほとんどありませんが、 Python 2 の資産が多い会社などでは Python 2 は今後も使い続けられるのかもしれません。
   

Python 環境の隔離方法は? ― Python environment isolation

上位は Virtualenv 56% 、 Docker 33% 、 Conda 23% 、 Pipenv 21% です。

 私は Conda のことをあまりよく知りませんが、 Conda 利用が結構多いようです。私は Poetry をよく使っていて不満が無いので、 Poetry を使う人がもっと増えればいいのになぁと思います。
   

ウェブフレームワークは何を使っている? ― Web frameworks

1 位 Flask 48% 、 2 位 Django 44% 、 3 位 Tornado 5% となっています(数字はおそらくフレームワークを利用する人の中での使用率です)。

Flask と Django が Python のウェブアプリケーションフレームワークで最も人気なことは知っていましたが、その他のフレームワークとここまで差が開いているのは意外でした。 Flask 人気ですね。

注釈によると、 Django はウェブ開発者によく使われていて、 Flask はウェブ開発者以外のユーザーによく使われている傾向があるようです。 個人的には、日本では Flask は「初学者の学習」以外の用途ではぜんぜん使われてなさそうなイメージを勝手に持っているのですが、わりと使われているんでしょうか。
 

データサイエンスのフレームワークとライブラリは何を使っている? ― Data science frameworks and libraries

上位に Numpy ・ Pandas ・ Matplotlib 、続いて SciPy ・ SciKit-Learn ・ TensorFlow ・ Keras ・ Seaborn ・ PyTorch ・ NLTK の名前があがっています。

私はこのあたり詳しくないので、「ふむそうなんだ」という感じです。実際に使うときに参考にします。
 

ユニットテスト用フレームワークは何を使っている? ― Unit-testing frameworks

1 位 pytest 49% 、 2 位 unittest 30% 、 3 位 mock 15% で、その後に Tox ・ nose が続きます。

pytest は Python に同梱の unittest よりも多く使われているとのことです。私も pytest を使うことが多いですが、 pytest がこんなにも広く使われていたとは知りませんでした。 pytest は慣れると使いやすくてとても便利ですが、公式ドキュメントがわかりづらくとっつきづらい印象があります。日本語の情報は特に少ないと思うのですが、英語の技術書を読まない日本人の Pythonista の人たちはどこで pytest を学んでいるのでしょう……
 

ORM ライブラリは何を使っている? ― ORMs

1 位 SQLAlchemy 36% 、 2 位 Django ORM 32% がダントツの使用率で、その後は 4% とがくっと落ちて SQLObject ・ Peewee が続きます。その次の PonyORM になるとまたぐっと数字が下がります。

SQLAlchemy はおそらく Flask でデータベースを扱うときのデファクトスタンダードになっているから高いのではないかと思いますが、こんなにも使用率が高いことに驚きです。 GitHub のスター数等を見て、 SQLAlchemy のシェアは Peewee あたりとそう変わらないものと思っていました。 SQLObject は私はほとんど知りませんが、これも結構使われているのですね。
 

クラウドプラットフォームは何を使っている? ― Top Cloud platforms

1 位 AWS 55% 、 2 位 Google Cloud Platform 33% 、 3 位 DigitalOcean 22% 、 4 位 Heroku 20% 、 5 位 Microsoft Azure 19% です。昨年比では Google Cloud Platform が 2pt 、 Microsoft Azure が 4pt 上がり、 DigitalOcean ・ Heroku はシェアを下げたそうです。 この勢いが続けば 2020 年(来年)の調査では Amazon ・ Google ・ Microsoft がトップ 3 になりそうです。

Microsoft はソフトウェアエンジニアからの支持が年々高まっている感じがします。 ということで、 Python Software Foundation と JetBrains が毎年行っている調査の 2019 年版の結果のご紹介でした。 ちなみに、匿名化された回答データ(集計されていないもの)も Creative Commons Attribution 4 ライセンスで公表されているので、興味がある方はそちらも覗いてみるとおもしろいかもしれません( ページの下の方にリンク があります)。
 

クラウドでどのようにコードを実行している?(本番環境) ― How do you run code in the cloud (in the production environment)

1 位「コンテナ内」 47% (+7pt) 、 2 位「仮想マシン」 46% (-1pt) 、 3 位「 PaaS 上」 25% (-3pt) となっています。カッコ内は昨年比です。 昨年は 1 位が仮想マシンで 2 位がコンテナ内だったので、そこから順番が逆転しました。

本番環境でのコンテナ利用はこんなにも広まっているんですね。ここまでにもなると、プロフェッショナルのウェブエンジニアにとってコンテナはもはや必修科目と言ってもよいでしょう。
 

構成管理ツールは何を使っている? ― Configuration Management tools

1 位 Ansible 20% 、 2 位「独自のやり方」 9% 、 3 位 Puppet となっています。

Python 利用者へのアンケートだからか Ansible が 1 位ですね。
 

エディタと IDE は何を使っている? ― Editors and IDEs

1 位 PyCharm 33% 、 2 位 VS Code 24% 、 3 位 Vim 9% となっています。注釈によると VS Code は 2017 年に 7% でスタートして 2019 年には 24% になったとのことです。

PyCharm のシェアが高いですね。ただ、 Python Software Foundation と JetBrains が行った調査なので、 PyCharm の利用率が高いのはある意味当然かもしれません。 VS Code はずいぶん後発でしたが、完全に受け入れらた感じですね。 VS Code が登場したときは VS Code がここまで広まるなんて予想もしませんでした。来年は VS Code のシェアがもっと上がっていそうな感じです。
 

Python 開発に利用しているツールと機能は? ― Tools and features for Python development

「使っている」の割合が 70% 以上のものとして、以下の 8 つがあがっています。

  1. VCS
  2. リファクタリング 
  3. エディタの自動補完機能 
  4. Python virtualenv
  5. コードリンティング
  6. SQL データベース
  7. テストコード
  8. デバッガ 

おそらく「 VCS 」ニアリーイコール Git でしょう。「 SQL データベース」は他のものと少しレベル感が違うような気もします。

 プロフェッショナルのソフトウェアエンジニアになりたいと考えている学生さんや社会人の方は、 Python エンジニアとしてやっていくならこのあたりは使える必要があると思っておくとよいかもしれません(ただし、日本国内なら、これらを押さえてなくてもぜんぜん就職はできると思います)。

Python の経験はどのくらい? ― Python experience

Python 経験 5 年以内の人が 74% を占めています。

後↓の年齢層のところでも見ますが、この原因は回答者に若い人が多いのと Python が近年特に盛り上がっていることにあるのでしょう。
 

チームのサイズは? ― Team size

チームサイズは 2 - 7 人が 75% となっています。 小規模のチームが多いようです。確かに Python は「日本的システムインテグレーター」の大規模開発とは真逆のイメージがあります。
 

年齢層は? ― Age range

20 代が 42% といちばん多く、続いて 30 代 32% 、 40 代 12% 、それから 18-20 歳 7% と続いています。

 若い人が多いです。

ということで、 Python 利用調査のご紹介でした。ここに取り上げていない質問項目もあるので、興味のある方はぜひオリジナルの方を見てみてください。
 
参考
同様の調査として Stack Overflow が毎年実施している調査もあります。違った質問項目もたくさんあるので、こちらも興味がある人にはおもしろいと思います。

2020/04/30

Python Tips: Python のプロジェクトで GitHub Actions を使いたい

GitHub Actions

今回は Python のプロジェクトで GitHub Actions を導入する方法をご紹介します。実際に動くかんたんなサンプルを使って説明します。


GitHub Actions とは

最初に GitHub Actions についてかんたんに説明します。

GitHub Actions とは GitHub 公式のワークフロー自動化ツールです。

2018 年 10 月にパブリックベータ版が公開され、 2019 年の 11 月に一般公開されました。それまで GitHub で CI/CD を行うには外部のサービスを利用する必要がありましたが、 GitHub Actions が導入されたことでコード管理と CI/CD を GitHub 内で一元的に行えるようになりました。

GitHub Actions は、 GitHub で管理されているリポジトリにディレクトリ .github/workflows/ を作成してその下に自動化したい処理を記述した YAML 形式の設定ファイルを置けばすぐに利用し始めることができます。処理を実行するプラットフォームは Linux / macOS / Windows の中からひとつ(または複数)選ぶことができます。

GitHub Actions の特徴のひとつに、 GitHub や他の人が作成し GitHub 上に公開したアクションを利用できる点があります。たとえば、次の内容を設定ファイルに記述すると、 actions/checkoutactions/setup-python というアクションをかんたんに利用することができます。

name: pytest

on:
  push:

jobs:
  pytest:
    name: Run tests with pytest
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up Python 3.7
        uses: actions/setup-python@v1
        with:
          python-version: 3.7

汎用度の高いアクションは誰かがオープンソースとして公開してくれていたりもするので、必ずしもすべての手順を自分でゼロから書く必要はありません。 CI/CD の経験があまり無い方やプログラミング初心者の方にも始めやすいかと思います。


Python プロジェクトでの GitHub Actions の使い方

Python プロジェクトでの GitHub Actions の使い方を説明します。

といっても、公式のドキュメントを読めば大体のことは書かれているので、スラスラと読んで理解できる方は公式のドキュメントを読むのがいちばんです。ここでは動くサンプルを使ってさわりの部分だけ説明します。

お話の前提として、 GitHub にアカウントを持っていて Python プロジェクトのリポジトリを置いているものとします。

GitHub Actions を使い始める方法は 2 つあります。

  • ブラウザで Actions のページを開く
  • ファイル .github/workflows/xxx.yml をコミットする

ブラウザで Actions のページを開くにはリポジトリの「 Actions 」タブをクリックします。ファイル .github/workflows/xxx.yml をコミットする場合は、手元のテキストエディタとターミナルをそのまま使います。どちらの形を選んでも最終的にできることは同じです。

以下、テストとスタイルチェックを行うかんたんなサンプルを使って説明します。次のツールを使用します。

  • poetry: 依存パッケージを管理する
  • pytest: テストを実行する
  • black: コーディングスタイルのチェックを行う

最初に GitHub 上に空のリポジトリを作成して、次の内容のファイル hello.py をコミットします。

hello.py:

"""関数 `hello()` を提供する"""


def hello(name: str = "world") -> None:
    """`Hello, xxx.` のメッセージを出力する"""
    print(f"Hello, {name}.")

続いて、テストファイルを作成します。 tests/test_hello.py あたりに作るのがよいでしょうか。

tests/test_hello.py:

from hello import hello


def test_hello_default(capsys):
    hello()
    out, err = capsys.readouterr()
    assert out == "Hello, world.\n"


def test_hello_with_name(capsys):
    hello("サザエ")
    hello("カツオ")
    out, err = capsys.readouterr()
    assert out == "Hello, サザエ.\n" "Hello, カツオ.\n"

これは pytest 用に作ったテストなので pytest をインストールします。私は Python のパッケージには poetry をよく使いますがここは pip でもそれ以外のものでもかまいません。

poetry add --dev pytest

pytest が無事にインストールできたら、 setup.py を作成してからテストを実行します。

setup.py:

from setuptools import setup, find_packages

setup(name="hello-github-actions", version="1.0", packages=find_packages())
poetry run pytest tests/test_hello.py
============================= test session starts ---===========================
platform linux -- Python 3.7.4, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: /app
collected 2 items

tests/test_hello.py ..                                                   [100%]

============================== 2 passed in 0.13s ---============================

成功することが確認できました。

続いて、このテストを GitHub Actions で実行するように設定ファイルを書きます。

リポジトリのルートに .github/workflows/ci.yml というファイルを作成し以下の内容で保存します。

.github/worflows/ci.yml:

name: pytest

on:
  push:
  pull_request:

jobs:
  pytest:
    name: Run tests with pytest
    # 実行環境として `ubuntu-latest` という名前のものを選ぶ
    runs-on: ubuntu-latest
    # 複数の Python のバージョンでテストするために `strategy.matrix` を設定する
    strategy:
      matrix:
        python-version: [3.7, 3.8]
    steps:
      # リポジトリをチェックアウトする
      # See: https://github.com/actions/checkout
      - name: Checkout
        uses: actions/checkout@v2
      # Python のランタイムをセットアップする
      # バージョンは `strategy.matrix` に並べたものを指定する
      # See: https://github.com/actions/setup-python
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v1
        with:
          python-version: ${{ matrix.python-version }}
      # Poetry そのものをインストールする
      # See: https://github.com/dschep/install-poetry-action
      - name: Install Poetry
        uses: dschep/install-poetry-action@v1.3
      # インストールした Poetry を使って必要な Python パッケージをインストールする
      - name: Install Dependencies
        run: poetry install --no-interaction
      # pytest を実行する
      - name: Run Tests
        run: poetry run pytest tests/

メインは jobs.pytest.steps の部分です。ここに指定したアクションが上から順に実行されます。

Python プロジェクトで GitHub Actions を使う場合はおそらく最初の 2 ステップ(チェックアウトと Python ランタイムのセットアップ)はほぼ共通になると思います。

各アクションがどういうことをしているかについてはインラインのコメントを見てください。

ちなみに、ディレクトリ .github/worflows/ はそのままこの名前にする必要がありますが、 ci.yml はこの名前でないといけないわけではありません。適当にわかりやすい名前を付けるとよいと思います。

ファイルが作成できたらコミットします。 poetry を使っている場合は pyproject.tomlpoetry.lock を、 pip を使っている場合は requirements.txt も忘れずにコミットしましょう。

コミットができたら GitHub に push します。すると、リポジトリの Actions のページに yaml ファイルで設定したワークフローが追加されていてテスト用のタスクが実行されるはずです。

これがうまく行ったら、おまけで black を使ったスタイルチェックも追加します。 poetry add をして、先ほどの .github/workflows/ci.yml を編集します。

poetry add --dev black

ファイルの末尾に以下の内容を追加します( black: の行が jobs の下に来るようにします)。インデントがおかしいと正しく動かないので注意してください。

  black:
    name: Check code style with Black
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up Python 3.7
        uses: actions/setup-python@v1
        with:
          python-version: 3.7
      - name: Install Poetry
        uses: dschep/install-poetry-action@v1.3
      - name: Install Dependencies
        run: poetry install --no-interaction
      - name: Check code style with Black
        run: poetry run black --check --diff .

コードに問題がなければ、このワークフローも GitHub Actions で実行され、結果が success として報告されるはずです。

ということで、かんたんではありましたが、 Python プロジェクトでの GitHub Actions の使い方についてでした。 GitHub Actions について深く知りたい方は公式のドキュメントその他を確認していただければと思います。

今回使ったサンプルを少し整理して GitHub にあげているので、興味のある方は参考にしてみてください:

この記事を書いている時点で GitHub Actions は無料で利用できますが、金額等は時間が経つと変わると思うので、ここには載せません。 GitHub 公式の情報を確認してみてください。


参考リンク

2020/04/17

Python ライブラリ: Pony ORM

Pony ORM


今回は Python の ORM ライブラリである Pony ORM を紹介します。

動作確認に使ったバージョンは次のとおりです。

  • python 3.7.7
  • pony 0.7.12

Pony ORM とは

Pony ORM (以下「 Pony 」)は Python の ORM ライブラリです。 ORM をご存知でない方のために念のために説明すると、 ORM とはオブジェクト・リレーショナル・マッパーの略で、プログラミング言語の「オブジェクト」とリレーショナルデータベースのテーブルとの間のデータのやりとりをよきようにやってくれる機能のことです。

Pony の特徴として公式では次の 4 つが謳われています。

中でも目を引く特徴は直感的なシンタックスで、次のような Python らしいコードで SQL クエリを生成することができます。

select(c for c in Customer if sum(c.orders.total_price) > 1000)
Customer.select(lambda c: sum(c.orders.total_price) > 1000)

実際に使ってみましょう。

Pony をインストールする

pip でインストールします。

python -m pip install pony

インストールが完了したら Python のコンソールでバージョンが確認できるはずです。

import pony

print(pony.__version__)
# => 0.7.12

Pony の基本的な使い方

データベースに接続する・テーブルを定義する

Pony を使うときには、最初にデータベースオブジェクトを生成し、それを使ってテーブルに相当するクラスを定義した上で、そのクラスを使ってデータベースを操作します。

from pony import orm

DB_NAME = 'db.sqlite'

# データベースオブジェクトを生成する
db = orm.Database()
db.bind(provider='sqlite', filename=DB_NAME, create_db=True)


# データベーステーブルに相当するクラスを定義する
class Article(db.Entity):
    """記事データを格納するテーブル"""
    slug = orm.Required(str)
    title = orm.Required(str)
    body = orm.Optional(str)
    data = orm.Optional(orm.Json)

    def __str__(self):
        return 'Article(title="{}")'.format(self.title)

テーブルのカラムは主に pony.orm.Requiredpony.orm.Optional を使用して定義します。引数には対象のカラムの型を渡します。ここでの説明は割愛しますが、その他のカラム設定を行いたい場合は第 2 引数以降で指定することができます。

その他カラムの定義に使えるものとして次のクラスが用意されています。

  • PrimaryKey
  • Set
  • Discriminator

参考:

テーブルに相当するクラスの定義ができたら、続いて実際のテーブルを作成します。テーブルの作成は pony.orm.Databasegenerate_mapping() メソッドを使用します。

db.generate_mapping(create_tables=True)
テーブルにレコードを挿入する

テーブルが作成できたら、テーブルに相当するクラス( Article )を使ってレコードを登録することができます。

with orm.db_session:
    a1 = Article(slug='hello', title='こんにちは')
    a2 = Article(slug='good-bye', title='さようなら')
    orm.commit()

レコードを登録するには、データベースセッションを開いてテーブルに相当するクラスのインスタンスを生成してから、変更をコミットします。データベースセッションを開くにはコンテキストマネージャ pony.orm.db_session を使います。変更のコミットには pony.orm.commit() を使用します。コンテキストマネージャ pony.orm.db_session はコンテキスト脱出時に自動的にコミットを行ってくれるので、上の例の場合は pony.orm.commit() による明示的なコミットは不要です。

pony.orm.db_session は、上の例のようにコンテキストマネージャとして使う方法に加えて関数のデコレータとして使う方法が用意されています:

@orm.db_session
def update_related_data():
    ...

コンテキストマネージャとしてもデコレータとしても使える pony.orm.db_session ですが、上述の「変更のコミット」の他にも「例外があがったときのロールバック」「コネクションプールへのデータベースコネクションの返却」「データベースセッションキャッシュのクリア」等を自動で行ってくれる機能が備わっています。

テーブルのレコードを取得する

テーブルにレコードが登録できたらそれを取得してみましょう。おそらく Pony の最大の特徴はこのレコードの取得方法です。pony.orm.select() とジェネレータ式を使ってシンプル・直感的に SELECT クエリを生成することができます。

全レコードの全カラムを順番に取得する:

with orm.db_session:
    for article in orm.select(a for a in Article):
        print(article)
# => Article(title="こんにちは")
# => Article(title="さようなら")
クラスメソッド select() を使った方法も用意されています。
with orm.db_session:
    for article in Article.select():
        print(article)
# => Article(title="こんにちは")
# => Article(title="さようなら")

全レコードの特定のカラムだけ順番に取得する:

with orm.db_session:
    for slug, title in orm.select((a.slug, a.title) for a in Article):
        print(slug, title)
# => hello こんにちは
# => good-bye さようなら

全要素の特定のカラムを取得しリスト化する:

with orm.db_session:
    slugs = orm.select(a.slug for a in Article)[:]
    print(slugs)
# => ['hello', 'good-bye']

条件に合致する 1 レコードだけ取得する:

with orm.db_session:
    article = orm.select(a for a in Article if a.slug == 'hello').get()
    print(article)
# => Article(title="こんにちは")
with orm.db_session:
    article = Article.get(slug='hello')
    print(article)
# => Article(title="こんにちは")

get() は、対象のレコードが複数件見つかったときには MultipleObjectsFoundError という例外をあげます。

複数件マッチしうるクエリで最初の要素のみ取得したい場合は次の first() を使用します。

条件に合致する最初のレコードを取得する:

with orm.db_session:
    article = orm.select(a for a in Article if 'kkk' in a.slug).first()
    print(article)
# => Article(title="こんにちは")

first() は該当するレコードが 0 件だったときは None を返します。

ORDER BY 句を使う:

with orm.db_session:
    for article in orm.select(a for a in Article).order_by(Article.slug):
        print(article)
# => Article(title="さようなら")
# => Article(title="こんにちは")

WHERE 句を使う:

with orm.db_session:
    for article in orm.select(a for a in Article if a.title.startswith('さ')):
        print(article)
# => Article(title="さようなら")
with orm.db_session:
    for article in orm.select(a for a in Article).where(lambda a: a.title.startswith('さ')):
        print(article)
# => Article(title="さようなら")

WHERE 句はジェネレータ式の ifでも where() メソッドでも書くことができます( filter() というまた別のメソッドも用意されています)。

発行されるクエリを確認する:

with orm.db_session:
    print(orm.select(a for a in Article).order_by(Article.slug).get_sql())
# => SELECT "a"."id", "a"."slug", "a"."title", "a"."body", "a"."data"
# => FROM "Article" "a"
# => ORDER BY "a"."slug"

発行されるクエリを確認したいときは get_sql() メソッドが使えます。

レコードを操作する

データベーステーブルの各レコードに相当するインスタンスにも便利なメソッドが用意されています。

primary key を取得する:

article.get_pk()
# => 2

複数のフィールドの値をまとめてセットする:

article.set(body='sayonara sayonara', data={'message': 'onara'})

dict に変換する:

article.to_dict()
# => {'id': 2, 'slug': 'good-bye', 'title': 'さようなら', 'body': 'sayonara sayonara', 'data': {'message': 'onara'}}

これらの他にも SQL と Python にある程度馴染みがあれば直感的に使える機能が多数用意されています。

この記事を書いたときに確認したかぎりでは API は 1 ページにまとまっているので、「こんなもの無いかな」と思ったときにも探しやすいと思います。

ということで、 Python のライブラリ Pony ORM の紹介でした。実際に利用してみたいと思う方は公式のドキュメント・リポジトリを見てみてください。

参考: