Python Orm:Peewee
#编程 #python #database #orm

注意:

resmi belgeiã§in:Peewee Docs

至少在基本层面上,以下概念/技术假设您知道自己知道:


在本文中,只要我知道切片对python,易于,但有效hä±peewee我们进行了介绍。

在整篇文章中,书籍数据库(Github)通过形成peewee'nin的基本方式,从此方式可以看到这种方式,我希望,我希望它会有用。

ä°â§erik:

为什么要佩维?

3使用船长和pealument; tuneucation)-ddã£pãpæpæpæpæpæpæpæpæpæpæpæpæpæpæpépádadkk。 足够的概念; 是开始的理想选择; Malmak就是这种情况。这可能会增加动力。
是已知的; (但不是Popãates)
我不做所有的源贡献。

设想

我们的模型(数据库表):

  • kitap
  • oku
  • knanketap
  • yazar
  • kitapdetay

我们要联系的一些数据:

  • 书籍清单。
  • 这本书的读者是谁?
  • 读者的名单和每个读者都读了一本书。
  • 读者读了什么书?
  • 书籍信息。

准备

hatä±rlatma!
应该使用Windows用户代替python3

komutSatä±rä±±±±±Bao lat±yoruz ...

a 名为kody2/klas线的目录表格,我应该做:

mkdir kitaplik
cd kitaplik

设置

使用Python软件包管理器(PIP)安装:

pip3 install peewee

安装到虚拟环境| Bu adımı geç

â潮湿!

1)创建虚拟环境:

python3 -m venv env

hatä±rlatma!
您也可以为您编写一个名称,而不是“ env”(â¶r:virtual_peewe。 /p>

2)让我们激活虚拟环境:

source env/bin/activate

记住!

env\Scripts\activate.bat

3)Yã¶Neticimizi(pip)gã¼ncelleyelim:

python3 -m pip install --upgrade pip

4),让我们给我们安装命令:

python3 -m pip install peewee

因此,分类虚拟环境,我们的虚拟环境,我们已经设置了Peewee。

5)让我们检查一下:
GNU/Linux üzerinde komut satırı


Eyä°Tabani Tanimlama abiaoq3

kodlamayabaåLä±Yoruz ...

0)VS Code edit了 “书柜” 从我们的目录开始:

code .

1)一个名为models.py的文件是日记,我们在名称中。

2)peeweeModã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lã¼lt -

import peewee as pw

3)veritabanä±mä±zä±tanä±mlayalä±m:

import peewee as pw

db = pw.SqliteDatabase("kitaplik.db")

ek bilgi
对于数据库,我们可以将db.close()用于后代, for Off。


建模表

在Peewee中,ilişkisel veritabanına遇到的概念是ÅU:

kavram karåä±lä±ää±
模型sä±nä±fä±(模型类) 数据库表
kolon/alanârneäI(field实例) veritabanä±tablo kolonu
模型ârneäI(模型实例) veritabanä±tabloSatä±rä±±td>

Å现在,让我们查看有关我们方案的上述信息。

ä°lisel数据数据“ book” “ reader” “ readed_kitap” peewee'daki对反对派的方式:

1)通过从peewee.Model限制中消耗我们的表,我们对您的班级有一个定义:

class Kitap(pw.Model):

ek bilgi
您可能想检查Å你可以看到:3.15.4

2)使用您的类:
使用我们的列/字段的列/区域

class Kitap(pw.Model):
    isim = pw.CharField(max_length=250, null=False, unique=True)

Yukurik±Da Handed15飞行员。< / / p>

  • 最多可能有250个字符。
  • 它不能为空。
  • 无法重复(必须是唯一的。)

3)我们要使用哪些模型的数据库以及其他设置将使用写作的子-Kode14:

class Kitap(pw.Model):
    isim = pw.CharField(max_length=250, null=False, unique=True)

    Class Meta:
        database = db
        legacy_table_names = False

我们的Kitap模型在上面;

  • id命名,每个记录值自动 1将增加将形成一个区域/列:

id = pw.IntegerField(primary_key=True)

  • 作为数据库 - 我们将同时使用更改。
  • veritabanä±nda tablo ismi,kucuk_isim bi -ImindeoluåAcak。

4)现在我们可以识别我们的Okuyucu型号。

但是在koud5文件的第一侧,名称kode22的名称,这样的类名称:

import peewee as pw

db = pw.SqlDatabase("kitaplik.db")

class Modelimiz(pw.Model):
    class Meta:
        database = db
        legacy_table_names = False

让我们继续从这个地方逗留,我们已经通过Modelimiz class确定了我们的Okuyucu模型:

class Okuyucu(Modelimiz):
    isim = pw.CharField(max_length=250, null=False, unique=True)

我还定义了我们的Okuyucu模型与我们的Kitap模型之间的关系:

class Okuyucu(Modelimiz):
    isim = pw.CharField(max_length=250, null=False, unique=True)
    kitaplar = pw.ManyToManyField(Kitap, backref="okuyucular")

OkunanKitap = Okuyucu.kitaplar.get_through_model()

yukarä±da;

  • Ouse14Sn'âââé的语法Yazekim 1zezaak Kaakmaz。 â/äøréSên。
  • 使用peewee.ManyToManyField,我们在OkuyucuKitap之间确定了。使用backref参数; 阅读的关键表达给书籍书中的读者。
  • 两个模型之间的关系需要OkunanKitap

âoka-ã§okä°liåki?

âoka-§ok与我们的关系; 阅读器可以阅读多本书。

以相同的方式 book 可以读取多个读者

ek bilgi
如果我们手中有读者,如果您读过他读过的书,我们可以联系到书中:

okuyucu.kitaplar

如果我们有书如果有一本书,那么 ÅUűrä±rä±:

kitap.okuyucular

5)最后,要将我们的模型传输到数据库,我们需要添加我的models.py文件:

db.create_tables([
    Kitap,
    Okuyucu,
    OkunanKitap
])

models.pydobeyamä±zä±n hali:

models.py modülü

Å现在命令销售我们的销售并将我们的模型转移到数据库:

python3 models.py

crudä°lemlerääÖ阿比亚奇3

crud?

  • c reate -oluåtur/ekle
  • r ead -oku/seã§/lists
  • u pdate -gã¼ncelle
  • d elete -sil

Hazä±rlä±k

一个名为crud.py的新文件和结构形式的结构形式:

crud.py modülü (şablon)

yukarä±da;
为了能够找到代码的代码块,我们的文件可用于我的文件。

创建(创建)

我们编码我们的create()函数,这是其中的第一部分...

1)书籍和读者记录定义:

k1 = Kitap(isim="Martin Eden")
k1.save()

yukarä±da;

  • 我们从我们的Kode15型号创建了一个新的 bookârneäi
  • save() ilekaydä±mä±zä±gerã§ekleåTardik。

2)这次使用create方法读取器记录声明:

o1 = Okuyucu.create(isim="Abdullah")

3)ÅNowde Kode43(Abdullah)阅读器

o1.kitaplar.add(k1)

hatä±rlatma!
Okuyucu型号kitaplar名称列标识。

4)如果您工作使用其他方法 一本新书

kitap_id = Kitap.insert(isim="Cinayet Alfabesi").execute()

ek bilgi
execute()方法是逆转的,并且是int类型的唯一记录。

5)现在使用Model.get()获取一些书籍录音。
之后,Kode43(Abdullah)读者对Kode52(谋杀字母)书籍的读者:

k2 = Kitap.get(Kitap.id == kitap_id)
k2.okuyucular.add(o1)

hatä±rlatma!
我们的Okuyucu模型中kitaplar列的参数是在backref="okuyucular"Å的附件中。

crud.py modülünün, create() fonksiyonu

记录清单(读)

read()编码我们的函数...

1)我们可以使用Model.select()fordã¶ngã¼sã¼列出我的书:

kitaplar = Kitap.select()
for kitap in kitaplar:
    print(kitap.id, kitap.isim)
pplos给上帝?

    for okuyucu in kitap.okuyucular:
        print(okuyucu.isim)

ek bilgi

  • 使用Model.select().count()len(Model.select()),我们可以采取查询结果的障碍 kadar kay±t bar。
  • 使用Model.select().sql(),我们可以达到查询 SQL比较。

2)让我们列出读者的数量及其阅读的书数:

for okuyucu in Okuyucu.select():
    print(okuyucu.isim, okuyucu.kitaplar.count())

crud.py modülünün, read() fonksiyonu

看到到目前为止所做的更改;
让我们将我的koud39文件添加到文件的底部,函数清晰度:

create()
read()

Å现在命令出售并查看结果并查看结果:

python3 crud.py

GNU/Linux üzerinde komut satırı

kayä±tgã¼ncelleme(更新)

我们编码我们的update()函数...

1)为了到达我的书,我应该无法做出必要的定义:

martin_eden = Kitap.get(Kitap.isim == "Martin Eden")

2)deäiåiikliäimiziTanä±mlayalä±m:

martin_eden.isim = "Martin Ede"

3)让我们添加记录并在屏幕上写入:

martin_eden.save()
print(martin_eden.isim)

4)Å现在使用不同方法的过程应能够识别:

Kitap.update(isim="Martin Eden").where(Kitap.id == martin_ed
den.id).execute()

execute() metodu,i了lemigerã§ekleåtirirvugã¼ncellenensatä±rsayä±sä±nä±nä± int tipindedindedindthindã¼r。

5)让我们立即将其添加到以下更改之后:

martin_eden = Kitap.get(Kitap.id == martin_eden.id)
print(martin_eden.isim)

Image description

5)最后,我的koud39文件的末端让我们添加函数

#create()
#read()
update()

yukarä±da;

  • create()read()§a±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

Å现在命令出售并查看结果并查看结果:

python3 crud.py

Image description

â俄克拉荷马州±t

我们编码我们的multi_create()函数...

1)我们有一个列表的列表,该列表是tuple的桶:

veriler = [("Musullu Süleyman",),
           ("İsimsiz",),
           ("İnsanları Okumak",),
           ("Bilim Ne değildir?",)]

yukarä±da;
tuple代表销售列,对于我们来说,拥有唯一的列,我们将其写在("Veri1",)Å的附件中。

2)让我们添加以保存书籍:

Kitap.insert_many(veriler, fields=[Kitap.isim]).execute()

3)为了以不同的方式拯救读者,我应该以相同的保存方式定义:

veriler = [{"isim": "İsimsiz"},
           {"isim": "Sefa"}]
Okuyucu.insert_many(veriler).execute()

这次,我们的veriler列表,dict类型柱。此外,ca insert_many()方法未收到fields=[]的参数。

我们继续录制书籍,并记录我们记录的读者的记录...

4)收据给读者:

isimsiz = Okuyucu.get(Okuyucu.isim.contains("siz"))
abdullah = Okuyucu.get(Okuyucu.isim.startswith("A"))
sefa = Okuyucu.get(Okuyucu.isim.endswith("fa"))

yukarä±da;

  • “你”的表达将被带出。
  • “ a”,启动将进行注册。
  • 将带有结束注册的“ FA”。

ek bilgi

  • 这些方法也可以在where()中使用。
  • ek larrak; between()in_()not_in(),... gibi bibiout ok mevcut。

5)被称为 book ,我将被确定读取器 列表:

aranacaklar = ["isi", "mus", "oku", "bil"]
okuyucular = [isimsiz, [abdullah, sefa], abdullah, [abdullah, sefa]]

yukarä±da;
2个听众在相同的数字中以相同的数字为单位,在sublist
中定义了一个以上的读者。

6)fordã¶ngã¼sã¼Yardä±mä±ylaTanä±mlamalarä±Gerã§ekleåTirelim:

index = 0
for aranan in aranacaklar:
    kitap = Kitap.get(Kitap.isim.contains(aranan))
    okuyucu = okuyucular[sayac]

    if type(okuyucu) == list:
        for _okuyucu in okuyucu:
            kitap.okuyucular.add(_okuyucu)
    else:
        kitap.okuyucular.add(okuyucu)

    index += 1

yukarä±da;

  • index有所不同,栏的索引值的列表是bar。
  • 在这个想法中,他搜索一本书,并将书转移到kitap更改中。阅读本书的读者已从okuyucular列表转移到okuyucu,这与更改不同。
  • 如果读这本书的okuyucu (即列表类型中); altarstrong> fordã¶ngâsü -stÖndür,每个读者都由书定义。
  • 如果阅读本书的读者是唯一的;读者被描述为书。
  • Döngü boyunca index değeri 1 arttırılıyor.

Image description

kayä±t silme(删除)

我们编码我们的()函数...

1)确定要删除:

kitap = Kitap.get(Kitap.isim == "İsimsiz")
okuyucu = Okuyucu.get(Okuyucu.isim == "İsimsiz")

2)让我们添加读者以删除书籍定义的书:

okuyucu.kitaplar.remove(kitap)

,反之亦然:

kitap.okuyucular.remove(okuyucu)

ek bigi
clear() metoh ini ini inei isi to dum«

3)现在我必须删除这本书:

kitap.delete_instance()

4)最后,让我们添加读者以删除不同的方式:

Okuyucu.delete().where(Okuyucu.id == okuyucu.id).execute()

execute()方法是指该过程,并删除了Streetstrong> Kode48类型的销售数量。

Image description


加入°ÅLllerä°

加入?

一次加入多个模型的过程 。我们可以将模型与的列相结合,例如peewee.ForeignKeyFieldpeewee.ManyToManyField,该模型由我们的模型定义。

Hazä±rlä±k

1)创建一个名为join.py的新文件,以结构形式的结构形式创建一个结构:
Image description

yukarä±da;

  • tarihiÅlemleriiã§indatetimemodeã¼nã¼iountaraktardä±k。
  • 我转移了需要和需要的模型。 peewee.DateField,db.connect(),20986年的年轻人。
  • 在使用peewee.ForeignKeyField的模型中,一对一的bir (书本书)和 bire-â-ã

bire-birä°liåki?

我们对我们说的一对一关系; 一本书,可以写作家或书,一个价格可以。

ie KitapDetay型号中的kitap列,一旦可以使用,同一本书将无法重复。

class KitapDetay(Modelimiz):
    kitap = pw.ForeignKeyField(Kitap, backref="kitaplar", primary_key=True)

yukarä±da;
感谢primary_key=True参数;调整唯一的id列,而不是无关的kitap_id。 book_id与Kode15的id列有关。 (bookdetay.kitap_id == kitap.id)

bire-siskä°liåki?

我们说的

bire-§ok§我们的关系;作者可以写书。

ie KitapDetay型号中的yazar列,可以重复一次以上。

class KitapDetay(Modelimiz):
    kitap = pw.ForeignKeyField(Kitap, backref="kitaplar", primary_key=True)
    yazar = pw.ForeignKeyField(Yazar, backref="yazarlar")

作为混凝土ârnek;
“ Martin Eden” Book 一旦您可以参加,“ Jack London”。 (我们可能想添加另一本杰克·伦敦的书;)

2)使用我们的第一个信息编码我们的create()函数:

Image description

yukarä±da;

  • 新作家将得救。
  • kitaplar列表将能够返回到for。遍及世界; “ book” “读取器” 信息Model.get()和-aynä±gã¶revi将与kode113一起进行。
  • 多亏了index的变化,将从“日期”和“价格”中收到信息。将添加到veriler列表中。
  • 最后,由于dã¶ngã¼,veriler列表将保存到我们的KitapDetay型号。

清单详细信息

为此,我们需要将KitapDetayKitap和Kude121型号组合起来。

1)ä°LkTanä±mlamamä±Zä±gerã§ekleåTirelim:

kitaplar = (KitapDetay
            .select(Kitap.isim,
                    Yazar.isim.alias("yazar"),
                    KitapDetay.tarih,
                    KitapDetay.fiyat))

yukarä±da;

  • 通过将我们的查询带到()§ok销售我们能够以某种方式重新撰写我的写作。
  • Kode123方法能够提供列给所需名称的名称。 (以我们的方式,书名和作者同时命名,我们已经阻止了推定。)

2)使用join()方法,让我们将我们的koud15模型添加到括号的乐趣中,以将我们的kode121模型与switch() ve join()方法相结合:

...
.join(Kitap)
.switch(KitapDetay)
.join(Yazar))

yukarä±da;

  • 多亏了switch()方法,Yazar型号将与Kitap型号结合使用,该模型具有可变的KitapDetay型号。在相反的情况下,在这两幅画之间,我们会因之间的关系而遇到错误。

ek bilgi

  • 仅使用where()或以ÅU的形式使用链表达式进行过滤器
...
.join(Yazar)
.where(Yazar.isim == "Martin Eden")
.where(KitapDetay.fiyat < 60)
.orwhere(KitapDetay.tarih.year >= 1995))

记住;我们可以使用它Kode135。

3)让我们将列表添加到括号中以查看日期中的列表:

...
.order_by(KitapDetay.tarih.desc()))

yukarä±da;
kode136 截止日期意味着您获得了。如果我们只说列名,则假设像使用asc()一样,在这种情况下,我们将是第一个日期的第一个日期。

ek bilgi
我们查询的结尾;我们可以添加诸如Kode138(forship for forshor)的方法,distinct()(我将单独列出)。

4)最后,我将被确定用于重新清单过程:

for kitap in kitaplar.dicts():
        print(kitap)

yukarä±da;

  • Criday 140,SubalPreganubónKónKónKónquéickQubépépégékékékékékékótMumb)mumse mumse mumse mumse mumsemötubkápæ

ek bilgi
tuples()namedtuples()也用于使用它。

Image description

上市读者

read()我们继续从该地点编码我们的功能...

1)这次select()将使用将在单独标识中使用的列:

miktar = pw.fn.COUNT(OkunanKitap.kitap_id).alias("okunan_miktar")
birlesik = Okuyucu.isim.concat("+").concat(Kitap.isim).alias("birlesik")

yukarä±da;

  • Ouse144欺骗NinieAtadéKoyé»Mark是殖民地; Kitap5555nake,Unudé«246f我说这是jonuu«talumimyila sayasica。
  • Kode147值可用的结肠;使用concat()方法,Okuyucu.isimKitap.isim列将能够在其列上组合“+”业务甲虫。

ek bilgi
我们还可以使用Kode123方法进行模型:

model = Model.alias("model_name")

2)以这个名称,我开始定义我们的okuyucular的查询不同:

okuyucular = (Okuyucu
              .select(Okuyucu.isim, miktar, birlesik)

3)让我们组合我们的OkunanKitap和kude15型号:

...
.join(OkunanKitap, pw.JOIN.LEFT_OUTER,
      on=(Okuyucu.id == OkunanKitap.okuyucu_id))
.join(Kitap, pw.JOIN.LEFT_OUTER,
      on=(Kitap.id == OkunanKitap.kitap_id))

yukarä±da;
join()方法,unionttttttttttté¼(lelft_outer,rıght_outer等)和组合选择(on =(on =())kul。

4)对于我们每个读者阅读的书籍列表,读者群

...
.group_by(Okuyucu.id)
.order_by(miktar, Okuyucu.isim))

yukarä±da;
order_by()方法,用于使用的多列。

5)最后,让我们看看我们的读者列表:

for okuyucu in okuyucular.objects():
   print(okuyucu.isim,
         okuyucu.okunan_miktar,
         okuyucu.birlesik)

yukarä±da;
objects()每个销售作为对象,它不将其用作对象。

Image description

6)现在让我们去命令销售,让我们看看结果:

python join.py

GNU/Linux üzerinde komut satırı

因此,我们已经完成了本文的结尾。在另一篇文章中,可以看到...