注意:
resmi belgeiã§in:Peewee Docs
至少在基本层面上,以下概念/技术假设您知道自己知道:
- 命令销售(在简单文件/目录过程的级别上)
- Python Programlama Dili
- Nesne Tabanlı Programlama(在类,实例和对象的级别)
- İlişkisel Veritabanı (Anlamanızı kolaylaÅırır)
在本文中,只要我知道切片对python,易于,但有效hä±peewee我们进行了介绍。
在整篇文章中,书籍数据库(Github)通过形成peewee'nin的基本方式,从此方式可以看到这种方式,我希望,我希望它会有用。
ä°â§erik:
- Neden Peewee?
- Senaryo
- Hazırlık
- Kurulum
- Veritabanı Tanımlama
- Tabloları Modelleme
- CRUD İşlemleri
- JOIN İşlemleri
为什么要佩维?
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 li>
- knanketap li>
- 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。
Eyä°Tabani Tanimlama abiaoq3
kodlamayabaåLä±Yoruz ...
0)VS Code edit了 “书柜” 从我们的目录开始:
code .
1)一个名为models.py
的文件是日记,我们在名称中。
2)peewee
Modã¼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
,我们在Okuyucu
和Kitap
之间确定了。使用backref
参数; 阅读的关键表达给书籍书中的读者。- 两个模型之间的关系需要
OkunanKitap
。
âoka-ã§okä°liåki?
âoka-§ok与我们的关系; 阅读器,可以阅读多本书。
以相同的方式 book ,可以读取多个读者。
ek bilgi 如果我们有书如果有一本书,那么 ÅUűrä±rä±: 5)最后,要将我们的模型传输到数据库,我们需要添加我的 Å现在命令销售我们的销售并将我们的模型转移到数据库: 一个名为 yukarä±da; 我们编码我们的create()函数,这是其中的第一部分... 1)书籍和读者记录定义: yukarä±da; 2)这次使用 3)ÅNowde Kode43(Abdullah)阅读器
hatä±rlatma! 4)如果您工作使用其他方法 一本新书
ek bilgi 5)现在使用 hatä±rlatma! read()编码我们的函数... 1)我们可以使用
如果我们手中有读者,如果您读过他读过的书,我们可以联系到书中:okuyucu.kitaplar
kitap.okuyucular
models.py
文件:
db.create_tables([
Kitap,
Okuyucu,
OkunanKitap
])
models.py
dobeyamä±zä±n hali:
python3 models.py
crudä°lemlerääÖ阿比亚奇3
crud?
Hazä±rlä±k
crud.py
的新文件和结构形式的结构形式:
为了能够找到代码的代码块,我们的文件可用于我的文件。
创建(创建)
k1 = Kitap(isim="Martin Eden")
k1.save()
save()
ilekaydä±mä±zä±gerã§ekleåTardik。create
方法读取器记录声明:
o1 = Okuyucu.create(isim="Abdullah")
o1.kitaplar.add(k1)
Okuyucu
型号kitaplar
名称列标识。
kitap_id = Kitap.insert(isim="Cinayet Alfabesi").execute()
execute()
方法是逆转的,并且是int
类型的唯一记录。
Model.get()
获取一些书籍录音。
之后,Kode43(Abdullah)读者对Kode52(谋杀字母)书籍的读者:
k2 = Kitap.get(Kitap.id == kitap_id)
k2.okuyucular.add(o1)
我们的Okuyucu
模型中kitaplar
列的参数是在backref="okuyucular"
Å的附件中。
记录清单(读)
Model.select()
和for
dã¶ngã¼sã¼列出我的书:
kitaplar = Kitap.select()
for kitap in kitaplar:
print(kitap.id, kitap.isim)
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())
看到到目前为止所做的更改;
让我们将我的koud39文件添加到文件的底部,函数清晰度:
create()
read()
Å现在命令出售并查看结果并查看结果:
python3 crud.py
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)
5)最后,我的koud39文件的末端让我们添加函数
#create()
#read()
update()
yukarä±da;
create()
和read()
§a±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
Å现在命令出售并查看结果并查看结果:
python3 crud.py
â俄克拉荷马州±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
类型柱。此外,cainsert_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)for
dã¶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>for
dã¶ngâsü -stÖndür,每个读者都由书定义。- 如果阅读本书的读者是唯一的;读者被描述为书。
- Döngü boyunca
index
deÄeri 1 arttırılıyor.
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类型的销售数量。
加入°ÅLllerä°
加入?
一次加入多个模型的过程 。我们可以将模型与的列相结合,例如 1)创建一个名为 yukarä±da; 我们对我们说的一对一关系; 一本书,可以写作家或书,一个价格可以。
ie yukarä±da; bire-§ok§我们的关系;作者可以写书。
ie 作为混凝土ârnek; 2)使用我们的第一个信息编码我们的 yukarä±da; 为此,我们需要将 1)ä°LkTanä±mlamamä±Zä±gerã§ekleåTirelim: yukarä±da; 2)使用 yukarä±da; ek bilgi 记住;我们可以使用它Kode135。 3)让我们将列表添加到括号中以查看日期中的列表: yukarä±da; ek bilgi 4)最后,我将被确定用于重新清单过程: yukarä±da; ek bilgi read()我们继续从该地点编码我们的功能... 1)这次 yukarä±da; ek bilgi 2)以这个名称,我开始定义我们的 3)让我们组合我们的 yukarä±da; 4)对于我们每个读者阅读的书籍列表,读者群
yukarä±da; 5)最后,让我们看看我们的读者列表: yukarä±da; 6)现在让我们去命令销售,让我们看看结果: 因此,我们已经完成了本文的结尾。在另一篇文章中,可以看到... peewee.ForeignKeyField
,peewee.ManyToManyField
,该模型由我们的模型定义。
Hazä±rlä±k
join.py
的新文件,以结构形式的结构形式创建一个结构:
(书本书)和 bire-â-ã
datetime
modeã¼nã¼iountaraktardä±k。db.connect()
,20986年的年轻人。
peewee.ForeignKeyField
的模型中,一对一的bir
bire-birä°liåki?
KitapDetay
型号中的kitap
列,一旦可以使用,同一本书将无法重复。
class KitapDetay(Modelimiz):
kitap = pw.ForeignKeyField(Kitap, backref="kitaplar", primary_key=True)
感谢primary_key=True
参数;调整唯一的id
列,而不是无关的kitap_id
。 book_id与Kode15的id
列有关。 (bookdetay.kitap_id == kitap.id)
bire-siskä°liåki?
我们说的KitapDetay
型号中的yazar
列,可以重复一次以上。
class KitapDetay(Modelimiz):
kitap = pw.ForeignKeyField(Kitap, backref="kitaplar", primary_key=True)
yazar = pw.ForeignKeyField(Yazar, backref="yazarlar")
“ Martin Eden” Book 一旦您可以参加,“ Jack London”。 (我们可能想添加另一本杰克·伦敦的书;)create()
函数:
kitaplar
列表将能够返回到for
。遍及世界; “ book” 和“读取器” 信息Model.get()
和-aynä±gã¶revi将与kode113一起进行。index
的变化,将从“日期”和“价格”中收到信息。将添加到veriler
列表中。veriler
列表将保存到我们的KitapDetay
型号。
清单详细信息
KitapDetay
,Kitap
和Kude121型号组合起来。
kitaplar = (KitapDetay
.select(Kitap.isim,
Yazar.isim.alias("yazar"),
KitapDetay.tarih,
KitapDetay.fiyat))
()
,§ok销售我们能够以某种方式重新撰写我的写作。
join()
方法,让我们将我们的koud15模型添加到括号的乐趣中,以将我们的kode121模型与switch() ve join()
方法相结合:
...
.join(Kitap)
.switch(KitapDetay)
.join(Yazar))
switch()
方法,Yazar
型号将与Kitap
型号结合使用,该模型具有可变的KitapDetay
型号。在相反的情况下,在这两幅画之间,我们会因之间的关系而遇到错误。
where()
或以ÅU的形式使用链表达式进行过滤器
...
.join(Yazar)
.where(Yazar.isim == "Martin Eden")
.where(KitapDetay.fiyat < 60)
.orwhere(KitapDetay.tarih.year >= 1995))
...
.order_by(KitapDetay.tarih.desc()))
kode136 截止日期意味着您获得了。如果我们只说列名,则假设像使用asc()
一样,在这种情况下,我们将是第一个日期的第一个日期。
我们查询的结尾;我们可以添加诸如Kode138(forship for forshor)的方法,distinct()
(我将单独列出)。
for kitap in kitaplar.dicts():
print(kitap)
tuples()
或namedtuples()
也用于使用它。
上市读者
select()
将使用将在单独标识中使用的列:
miktar = pw.fn.COUNT(OkunanKitap.kitap_id).alias("okunan_miktar")
birlesik = Okuyucu.isim.concat("+").concat(Kitap.isim).alias("birlesik")
Kitap
5555nake,Unudé«246f我说这是jonuu«talumimyila sayasica。
concat()
方法,Okuyucu.isim
和Kitap.isim
列将能够在其列上组合“+”业务甲虫。
我们还可以使用Kode123方法进行模型:model = Model.alias("model_name")
okuyucular
的查询不同:
okuyucular = (Okuyucu
.select(Okuyucu.isim, miktar, birlesik)
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))
join()
方法,unionttttttttttté¼(lelft_outer,rıght_outer等)和组合选择(on =(on =())kul。
...
.group_by(Okuyucu.id)
.order_by(miktar, Okuyucu.isim))
order_by()
方法,用于使用的多列。
for okuyucu in okuyucular.objects():
print(okuyucu.isim,
okuyucu.okunan_miktar,
okuyucu.birlesik)
objects()
每个销售作为对象,它不将其用作对象。
python join.py