Python使用Peewee創(chuàng)建數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例
Peewee簡(jiǎn)介
Peewee是一個(gè)簡(jiǎn)單小巧的Python ORM(對(duì)象關(guān)系映射 Object Relational Mapping,簡(jiǎn)稱ORM),支持SQLite、MySQL、PostgreSQL等數(shù)據(jù)庫(kù),本文主講前兩者。
創(chuàng)建MySQL數(shù)據(jù)庫(kù)
- 去官網(wǎng)下載MySQL并啟動(dòng)mysql服務(wù);
- 打開MySQL Workbench配置好數(shù)據(jù)庫(kù),如密碼等;
- 在PyCharm中用Peewee創(chuàng)建數(shù)據(jù)庫(kù),如db_model.py;
from peewee import * # test為數(shù)據(jù)庫(kù)名,并需安裝mysql庫(kù) db = MySQLDatabase("test", **{'charset': 'utf8', 'use_unicode': True, 'host': 'localhost', 'user': 'root', 'password': '***'}) # 基類 class BaseModel(Model): class Meta: database = db # 表類 class Test(BaseModel): id = IntegerField(primary_key=True) name = CharField() gender = CharField() class Meta: # 表名 table_name = 'Test' # 創(chuàng)建表 def create_table(table): if not table.table_exists(): table.create_table() # 刪除表 def drop_table(table): if table.table_exists(): table.drop_table() # 創(chuàng)建一張Test表 create_table(Test)
- 再打開MySQL Workbench就可以看到剛剛創(chuàng)建的Test數(shù)據(jù)庫(kù)和Test表;
創(chuàng)建SQLite數(shù)據(jù)庫(kù)
- SQLite數(shù)據(jù)庫(kù)可以直接由Peewee創(chuàng)建,與上db_model.py類似,修改創(chuàng)建語(yǔ)句即可;
# 數(shù)據(jù)庫(kù)文件路徑 db_path = "../database/test.db" db = SqliteDatabase(db_path) # PostgreSQL數(shù)據(jù)庫(kù)則調(diào)用PostgresqlDatabase方法即可 # db = PostgresqlDatabase('test', user='postgres')
創(chuàng)建完畢可以通過PyCharm自帶的Database查看數(shù)據(jù)庫(kù),也可以使用其它軟件查看
- 本想通過DBeaver打開db文件(包括連接MySQL數(shù)據(jù)庫(kù)),方便后續(xù)操作,嘗試半天發(fā)現(xiàn)可以連接但是怎么都無(wú)法顯示,不知道是否與版本問題有關(guān)(這里嘗試的是21.0.3版本),后來(lái)使用了JetBrains DataGrip(據(jù)說很好用),成功打開db文件(也可以使用SQLite Studio)
Peewee操作數(shù)據(jù)庫(kù)
列舉常用操作,即增刪改查,其它操作后續(xù)慢慢補(bǔ)充
新增
t = Tset(name="test", gender="男") t.save() # 或者 t = Test() t.name = "test" t.gender = "男" t.save() # insert() 只插入數(shù)據(jù),不返回對(duì)象實(shí)例 Test.insert(name="test", gender="男").excute() # insert_many() 插入多行,rows為元組或字典列表,fields為需要插入的字段名list列表 rows = [ {"name": "test1", "gender": "男"}, {"name": "test2", "gender": "女"} ] insert_many(rows, fields=None).execute() # 或 rows = [ {"test1", "男"}, {"test2", "女"} ] fields = ["name", "gender"] insert_many(rows, fields=fields).execute()
刪除
# where()是條件,execute()是執(zhí)行 Test.delete().where(Test.name == "test").execute() # 已經(jīng)實(shí)例化的數(shù)據(jù), 使用delete_instance() t = Tset(name="test", gender="男").save() t.delete_instance()
查詢
找到了會(huì)返回model實(shí)例,未找到會(huì)拋出異常DoesNotExist
# 查詢單條數(shù)據(jù),多條件用逗號(hào)或邏輯運(yùn)算符隔開,也支持其它比較符(大于小于等) t = Test.get(Test.name == "test") # 使用where().get()查詢 t = Test.select().where(Test.name == "test").get() # 查詢多條數(shù)據(jù) tests = Test.select().where(Test.gender == "男") # 迭代結(jié)果 for t in tests: t.save() # in操作 tests = Test.select().where(Test.gender.in_(["男"])) # 通過id獲取 t = Test.get_by_id(1) # 嘗試獲取,不存在則創(chuàng)建,t為實(shí)例,created為是否創(chuàng)建 # 參數(shù)name為自定義查詢條件,dafaults并非查詢條件,而是創(chuàng)建字段 t, created = Test.get_or_create(name="test", defaults={"gender": "男"}) # {"gender": "男"}也可以寫作dict(gender="男") # 查詢結(jié)果轉(zhuǎn)字典dicts t = Test.select().dicts() # 只返回元組迭代器tuples t = Test.select().tuples()
查詢條件支持的比較符和運(yùn)算符
符號(hào) | 含義 |
---|---|
& | 與 |
| | 或 |
~ | 非 |
== | 等于 |
< | 小于 |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
!= | 不等于 |
<< | x in y,其中 y 是列表或查詢 |
>> | x is y,其中 y 可以是 None |
% | x like y,where(Test.name % “a*”)區(qū)分大小寫 |
** | x like y,where(Test.name ** “a%”)不區(qū)分大小寫 |
其它查詢條件,如
tests = Test.select().where(Test.name.contains("t"))
.in_(value) IN查找(與相同<<)。
.not_in(value) 不在查詢中。
.is_null(is_null) 是NULL還是IS NOT NULL。接受布爾參數(shù)。
.contains(substr) 通配符搜索子字符串。
.startswith(prefix) 搜索以開頭的值prefix。
.endswith(suffix) 搜索以結(jié)尾的值suffix。
.between(low, high) 在low和之間搜索值high。
.regexp(exp) 正則表達(dá)式匹配(區(qū)分大小寫)。
.iregexp(exp) 正則表達(dá)式匹配(不區(qū)分大小寫)。
.bin_and(value) 二進(jìn)制AND。
.bin_or(value) 二進(jìn)制或。
.concat(other) 使用串聯(lián)兩個(gè)字符串或?qū)ο髚|。
.distinct() 標(biāo)記列以進(jìn)行DISTINCT選擇。
.collate(collation) 用給定的排序規(guī)則指定列。
.cast(type) 將列的值強(qiáng)制轉(zhuǎn)換為給定的類型。
修改
# 已經(jīng)實(shí)例化的數(shù)據(jù),直接修改對(duì)象屬性并save() t = Tset(name="test", gender="男").save() t.gender = "女" t.save() # 查詢后并用update()更新 t = Tset.update({Tset.gender: "女"}).where(Person.name == "test") t.execute() # 查詢出對(duì)象并修改屬性 t = Test.get(Test.name == 'test') t.gender = "女" t.save()
其它
# 使用order_by()進(jìn)行排序,多個(gè)字段用分號(hào)隔開 tests = Test.select().order_by(Test.id) # 升序(默認(rèn)) tests = Test.select().order_by(Test.id.asc()) tests = Test.select().order_by(+Test.id) # 降序 tests = Test.select().order_by(Test.id.desc()) tests = Test.select().order_by(-Test.id) # 使用count()進(jìn)行統(tǒng)計(jì) n = Test.select().count() # 執(zhí)行原生語(yǔ)句 name = "test" gender = "男" Test.raw('SELECT * FROM test WHERE name= %s and gender = %s', name, gender) # fn操作 # 1.Avg 平均值 # 2.Sum 和 # 3.Max 最大值 # 4.Min 最小值 # 5.Count 合計(jì) # 6.Substr 切片 t= Test.select(fn.MAX(Test.id))
補(bǔ)充
創(chuàng)建表格時(shí)的常用類型
AutoField:integer
JsonField: 8字節(jié)
MediumJSONField: 16字節(jié)
UUIDField:varchar(40)
CharField:varchar
IntegerField:integer
DecimalField:numeric
TextField:text
DateTimeField:datetime
DateField:date
TimeField:time
FixedCharField:char
BigAutoField:bigint
BigIntegerField:bigint
SmallIntegerField:smallint
IdentityField:not supported
FloatField:real
DoubleField:double precision
BlobField:blob
BitField:bigint
BigBitField:blob
BinaryUUIDField:varbinary(16)
TimestampField:integer
IPField:bigint
BooleanField:bool
BareField:not supported
ForeignKeyField:integer
ManyToManyField:無(wú)
創(chuàng)建表格時(shí)的常用字段
null = False 是否允許空字符串。
index = False 是否創(chuàng)建普通索引。
unique = False 是否創(chuàng)建唯一索引。
column_name = None 在數(shù)據(jù)庫(kù)中指定列的名稱,一般不設(shè)置會(huì)使用定義model時(shí)的變量名作為列名。
default = None 設(shè)置默認(rèn)值。
primary_key = False 是否為主鍵。
constraints = None 增加約束,如果增加,該值是一個(gè)列表。
collation = None 用于排序字段或索引的排序規(guī)則。
choices = None 設(shè)置可選的枚舉選項(xiàng),值是一個(gè)元組,元素也是一個(gè)元組,例如((1,‘女’),(2,‘男’))。
help_text = None 設(shè)置備注或注釋文本。
verbose_name = None 設(shè)置一個(gè)可讀性良好的名稱,例如 name = CharField(verbose_name = ‘用戶名’)。
index_type = None 指定索引類型,不常用,一般默認(rèn)即可。
到此這篇關(guān)于Python使用Peewee創(chuàng)建數(shù)據(jù)庫(kù)的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)Python Peewee創(chuàng)建數(shù)據(jù)庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pandas如何通過np.array函數(shù)或tolist方法去掉數(shù)據(jù)中的index
這篇文章主要介紹了Pandas如何通過np.array函數(shù)或tolist方法去掉數(shù)據(jù)中的index問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02python使用xslt提取網(wǎng)頁(yè)數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了Python使用xslt提取網(wǎng)頁(yè)數(shù)據(jù)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02python 計(jì)算平均平方誤差(MSE)的實(shí)例
今天小編就為大家分享一篇python 計(jì)算平均平方誤差的實(shí)例 (MSE),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-06-06如何在Cloud Studio上執(zhí)行Python代碼?
這篇文章主要介紹了如何在Cloud Studio上執(zhí)行Python代碼?,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08