Peewee – 关系和连接
Peewee支持实现不同类型的SQL JOIN查询。它的模型类有一个 join() 方法,返回一个Join实例。
M1.joint(m2, join_type, on)
将M1模型的表映射到m2模型的表,并返回Join类实例。on参数默认为None,是作为连接谓词使用的表达式。
连接类型
Peewee支持以下Join类型(默认为INNER)。
- JOIN.INNER
-
join.left_outer
-
join.right_outer
-
JOIN.FULL
-
join.full_outer
-
JOIN.CROSS
为了展示join()方法的使用,我们首先声明以下模型 –
db = SqliteDatabase('mydatabase.db')
class BaseModel(Model):
class Meta:
database = db
class Item(BaseModel):
itemname = TextField()
price = IntegerField()
class Brand(BaseModel):
brandname = TextField()
item = ForeignKeyField(Item, backref='brands')
class Bill(BaseModel):
item = ForeignKeyField(Item, backref='bills')
brand = ForeignKeyField(Brand, backref='bills')
qty = DecimalField()
db.create_tables([Item, Brand, Bill])
表格
接下来,我们用以下测试数据填充这些表格 −
项目表
项目表的内容如下
品牌表
下面给出的是品牌表-
账单表
账单表如下 –
要在品牌表和项目表之间进行简单的连接操作,请执行以下代码 –
qs=Brand.select().join(Item)
for q in qs:
print ("Brand ID:{} Item Name: {} Price: {}".format(q.id, q.brandname, q.item.price))
结果的输出将如下 –
Brand ID:1 Item Name: Dell Price: 25000
Brand ID:2 Item Name: Epson Price: 12000
Brand ID:3 Item Name: HP Price: 25000
Brand ID:4 Item Name: iBall Price: 4000
Brand ID:5 Item Name: Sharp Price: 12000
连接多个表
我们有一个账单模型,与项目和品牌模型有两个外键关系。要从所有三个表中获取数据,请使用以下代码
qs=Bill.select().join(Brand).join(Item)
for q in qs:
print ("BillNo:{} Brand:{} Item:{} price:{} Quantity:{}".format(q.id, \
q.brand.brandname, q.item.itemname, q.item.price, q.qty))
根据我们的测试数据,将显示以下输出结果
BillNo:1 Brand:HP Item:Laptop price:25000 Quantity:5
BillNo:2 Brand:Epson Item:Printer price:12000 Quantity:2
BillNo:3 Brand:iBall Item:Router price:4000 Quantity:5