Open1
Python(3) マイナーORM
何故か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
外には幾つか散見
非常に特徴的かつ判りにくいところは、
-
いわゆるmodel規定クラスがないかわりに、Database().Entityを継承することとか
-
クエリにpython3のジェネレータ式を直接受け付けるところとか
-
n:mのリレーションを定義すると、中間テーブルを勝手に作るところとか
-
PonyORM - Python ORM with beautiful query syntax
ponyorm/pony: Pony Object Relational Mapper
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