Open1

Python(3) マイナーORM

karamawanukaramawanu

何故かqiita界隈ではsqlalchemy一択(検索561件、タグ161件)だけど他もあるにはある。

いずれもクエリで、かなり特殊な記述をするのが特徴。ぱっと見、Python/DBどっちで動くものなのかわからなくなるやつ。 linqに影響を受けてるのだろうか?

以下、ソースはすべてオフィシャルからのコピー

peewee 検索35 タグ8

coleifer/peewee: a small, expressive orm -- supports postgresql, mysql and sqlite
peewee — peewee 3.13.3 documentation

from peewee import *
import datetime


db = SqliteDatabase('my_database.db')

class BaseModel(Model):
    class Meta:
        database = db

class User(BaseModel):
    username = CharField(unique=True)

class Tweet(BaseModel):
    user = ForeignKeyField(User, backref='tweets')
    message = TextField()
    created_date = DateTimeField(default=datetime.datetime.now)
    is_published = BooleanField(default=True)

比較演算子でクエリを書けるのが特徴。

query = (Facility
         .select(Facility.facid, Facility.name, Facility.membercost,
                 Facility.monthlymaintenance)
         .where(
             (Facility.membercost > 0) &
             (Facility.membercost < (Facility.monthlymaintenance / 50))))

大外の括弧は、メソッドチェインの途中で改行を使いたいための小細工だと思われる。

ponyorm

外には幾つか散見

非常に特徴的かつ判りにくいところは、

from pony.orm import *

db = Database()

class MyEntity(db.Entity):
    attr1 = Required(str)

上の宣言とは食い違ってるがselect例

select(c for c in Customer if sum(c.orders.price) > 1000)

この式から、次のSQLを生成する。

SELECT "c"."id"
FROM "customer" "c"
  LEFT JOIN "order" "order-1"
    ON "c"."id" = "order-1"."customer"
GROUP BY "c"."id"
HAVING coalesce(SUM("order-1"."total_price"), 0) > 1000