黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

經(jīng)驗(yàn)拾憶(純手工)=> Python-ORM之peewee:插件拓展(三)

系統(tǒng) 1954 0

聲明

本篇主要講,關(guān)于peewee的一些拓展:
包括新式CRUD-數(shù)據(jù)導(dǎo)入導(dǎo)出-信號(hào)-數(shù)據(jù)庫(kù)反向生成模型。
擴(kuò)展官檔:http://docs.peewee-orm.com/en...

作者友好 與 peewee提問(wèn)方式

當(dāng)我用到拓展模塊的 新CRUD時(shí),文檔給的內(nèi)容少之又少。
因?yàn)橥卣沟男翪RUD是真的方便好用,和(PyMongo的用法差不多)
但是功能卻不全。并且與我們第二篇,講的CRUD又不兼容。
所以在難以取舍之際, 我選擇了提問(wèn)。

peewee作者在官檔中詳細(xì)說(shuō)到。 如果你有問(wèn)題或疑惑可以通過(guò)以下兩種方式:

  1. 去stack overflow 提問(wèn)題,標(biāo)簽打上python 和 peewee。 peewee作者會(huì)不定期瀏覽并回答你給你幫助。
  2. 去https://groups.google.com/gro...,這個(gè)google群組提問(wèn)。(需要科學(xué)上網(wǎng))

所以我選擇了去 stack overflow提問(wèn)。

我問(wèn)題發(fā)出去,應(yīng)該是不到一小時(shí),作者就給回復(fù)了,我驚了。。(發(fā)完我就睡覺(jué)了,第二天起來(lái)才看到)
提問(wèn)內(nèi)容傳送門(mén)如下:https://stackoverflow.com/que...

作者回復(fù)的意思是:

拓展的playhouse.dataset里面的DataSet 的 新式CRUD API 的涉及初衷就是為了簡(jiǎn)單使用。
但它并不會(huì)代替 核心CRUD (就是我們第二篇講的CRUD)
并且,它設(shè)計(jì)的初衷就是讓我們可以方便 (json/csv格式的數(shù)據(jù) 與 數(shù)據(jù)庫(kù)的數(shù)據(jù) 相互導(dǎo)入或?qū)С觯?
我說(shuō)的這些操作,下面都會(huì)寫(xiě)到。

所以說(shuō),該提問(wèn)就提問(wèn),你收獲了peewee知識(shí)的同時(shí),又能增加peewee的社區(qū)活躍度。

playhouse擴(kuò)展模塊的DataSet

我們前2篇文章就用了這一行代碼就可以導(dǎo)入所有,因?yàn)樗谢竟δ芏技稍?peewee下

          
            from peewee import *
          
        

但接下來(lái)講的是擴(kuò)展,而擴(kuò)展就是新分支了,與peewee沒(méi)關(guān)系了

          
            from playhouse.dataset import DataSet

          
        

數(shù)據(jù)庫(kù)連接

進(jìn)入正題,連接MySQL,你可以有兩種連接方式:

          
            # 強(qiáng)調(diào)一下,官檔中給出 DataSet 是在 playhouse.dataset 下
# 我再?gòu)?qiáng)調(diào)一下, 是 DataSet , 而不是 DataBase  !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
from playhouse.dataset import DataSet
db = DataSet('mysql://root:Jilin963389970@39.107.86.223:3306/test')

          
        

官檔-所有數(shù)據(jù)庫(kù)的連接示例: http://docs.peewee-orm.com/en...

數(shù)據(jù)庫(kù)與表的基本操作

創(chuàng)建表

          
            owner = db['owner']
# 后面這個(gè)"owner" 是你自己指定的key, 也就是你指定的 "表名"
# 前面這個(gè) owner 變量用來(lái)接受返回結(jié)果,它就是一個(gè)實(shí)例化的表對(duì)象。 一會(huì)我們用它做一系列操作

我講完了,表已經(jīng)創(chuàng)建好了,  (你臉上有沒(méi)有出現(xiàn)問(wèn)號(hào)。。) 驚不驚喜,意不意外??
題外話(huà):
    如果你用過(guò),pymongo來(lái)使用MongoDB, 那這種原理應(yīng)該不陌生的。
 
那 owner = db['owner']     這一行代碼究竟做了什么?
    1. 它會(huì)去數(shù)據(jù)庫(kù),創(chuàng)建一個(gè) 名為 owner的表 (有則返回,無(wú)則創(chuàng)建)
    2. 不但創(chuàng)建了表, 而且它還在表中 自動(dòng)創(chuàng)建了一個(gè) id  (int型,主鍵,自增)

          
        

列出表 & 列出字段

列出表(等價(jià)于MySQL中的命令: show tables)

          
            print(db.tables)  
>> ['new_owner', 'owner']
          
        

列出表中的字段(等價(jià)于MySQL中的命令: show columns):

          
            table = db['owner']        # 先選擇一個(gè)表。
print(table.columns)
>> ['id', 'name', 'age', 'gender', 'hobby', 'nickname']
          
        

統(tǒng)計(jì)表中記錄數(shù)(就是行數(shù))

          
            print(len(table))
>> 10
          
        

事務(wù)(transaction)

其實(shí)我在第一篇,已經(jīng)講過(guò)事務(wù)了
事務(wù)-傳送門(mén): https://segmentfault.com/a/11...

          
            當(dāng)時(shí)我是用的 MySQLDatabase 連接工具。 
    我只講了一種使用方法:  db.atomic()
    其實(shí)還有另外一種使用方法,就是  db.transaction()
    這兩種方法差不多, 你可以這么認(rèn)為,就是把 atomic 和 transaction 單詞換一下,用法一模一樣

而現(xiàn)在我們是使用的 DataSet 連接工具 (開(kāi)篇我強(qiáng)調(diào)過(guò)):
    db = DataSet(....)   
    DataSet 只提供給我們   transaction()這種用法, 而沒(méi)有提供 atomic()
    
但我說(shuō)了,這兩種用法你可以認(rèn)為只是單詞換了一下。用法一樣的。
因此你完全可以直接看我前面給的 "事務(wù)-傳送門(mén)" 這篇之前寫(xiě)的文章。  
          
        

CRUD (這種CRUD方式我不太推薦)

  1. 我們第二章詳細(xì)講過(guò)全套的CRUD,其實(shí)那就夠了。
  2. 而本章這個(gè)拓展的CRUD,完全是另一種模式。另一個(gè)模塊的東西。
  3. 但我不推薦用,因?yàn)楦杏X(jué)還沒(méi)成熟,不完善(很多CRUD細(xì)節(jié)功能沒(méi)有), 官檔給的也粗略。
  4. 此外,下面涉及到與 本套CRUD有關(guān)聯(lián)的操作, 我下面統(tǒng)稱(chēng)為 "拓展的CRUD"

增加數(shù)據(jù)

          
            owner.insert(name='Alice', age=20)
owner.insert(name='Zhang', age=18)

這看起來(lái)沒(méi)什么問(wèn)題,我們之前講的差不多。但你有沒(méi)有意識(shí)到幾個(gè)問(wèn)題:
1. owner表 是自動(dòng)創(chuàng)建出來(lái)的,它只有一個(gè)主鍵。
2. 我們沒(méi)有創(chuàng)建 name 和 age 字段
3. 既然沒(méi)有創(chuàng)建字段,為什么可以插入數(shù)據(jù)???

解惑:
    1. 我們調(diào)用第一個(gè) insert()的時(shí)候, 它就會(huì)自動(dòng)幫我們 去數(shù)據(jù)庫(kù)創(chuàng)建對(duì)應(yīng)參數(shù)的字段(固定了):
       數(shù)據(jù)類(lèi)型關(guān)系對(duì)照如下:
           python數(shù)據(jù)類(lèi)型  MySQL數(shù)據(jù)類(lèi)型
               int            int(11)     允許為空   默認(rèn)值未空
               str            text        允許為空   默認(rèn)值未空
        那peewee為我們自動(dòng)創(chuàng)建的字段如下:
        +-------+---------+------+-----+---------+----------------+
        | Field | Type    | Null | Key | Default | Extra          |
        +-------+---------+------+-----+---------+----------------+
        | id    | int(11) | NO   | PRI | NULL    | auto_increment |
        | name  | text    | YES  |     | NULL    |                |
        | age   | int(11) | YES  |     | NULL    |                |
        +-------+---------+------+-----+---------+----------------+
    2. 創(chuàng)建后,它還會(huì)自動(dòng)為我們根據(jù)我們傳的參數(shù), 對(duì)應(yīng)的插入 值
    3. 特別注意,特別注意:
        假如我們插入這樣一條錯(cuò)誤"類(lèi)型"的數(shù)據(jù): 
            owner.insert(name=18, age=18)    # 按理說(shuō)name應(yīng)該為 text型,age應(yīng)該為整形
            雖然我們name給的整形,但,peewee內(nèi)部會(huì)自動(dòng)為我們轉(zhuǎn)為將 name轉(zhuǎn)為字符串類(lèi)型
            同理 字符串也會(huì)自動(dòng)幫我們轉(zhuǎn)為整形(對(duì)應(yīng)數(shù)據(jù)庫(kù)中的類(lèi)型)。 但'abc'這樣的轉(zhuǎn)不了哦
          
        

修改數(shù)據(jù)

          
            owner.update(name='Alice',  age='50')
這行代碼為我們做了如下事情:
    將"所有"行數(shù)據(jù), name改為 Alice, age改為 50
    
owner.update(name='Alice',  age='50',columns=['name'])
多加了一個(gè) columns參數(shù),為我們做了如下事情:
    先看最后的 columns=['name']  : 其實(shí)他就等價(jià)于  where name = xxx
    其實(shí)意思就是以 "name字段為條件" 修改數(shù)據(jù):(而name我們已經(jīng)給了 = 'Alice')
    具體過(guò)程如下:
        1. 找到 name = Alice, 的所有記錄
        2. 將 name= Alice 的記錄   name改為Alice(相當(dāng)于沒(méi)變), age 改為 50

owner.update(gender='man')
    你仔細(xì)看看,我們之前是沒(méi)有 gender這個(gè)字段的。 如果更新未創(chuàng)建字段,它會(huì)為我們做如下事情:
    1. 它會(huì)自動(dòng)為我們?cè)谶@個(gè)表中創(chuàng)建一個(gè) 這個(gè) "gender新字段"
    2. 并且,"所有行記錄" 都會(huì)被賦予成 "man" 值。 注意是 所有行,所有行,所有行
    
    3. 如果你只想"給指定記錄部分"賦予 "man"值, 那你可以加一個(gè)我們之前說(shuō)的 "columns參數(shù)"
       自然而然地,其他 "未通過(guò) columns指定的記錄" 就會(huì)被賦予 NULL 值。
          
        

查詢(xún)數(shù)據(jù)

首先說(shuō)一下它這個(gè)查詢(xún)的特色。

  1. 可以對(duì)查詢(xún)結(jié)果進(jìn)行 切片,索引操作(和python的切片和索引是一模一樣的)
  2. 索引之后自動(dòng)轉(zhuǎn)為 列表嵌字典 [{}, {}]
  3. 下面3種方式,也都支持 切片和索引(我就不舉例了,很簡(jiǎn)單)

方式1:all() 獲取全部數(shù)據(jù)

          
            owner = db1['owner']
query = owner.all()
for obj in query:
    print(obj)        # 遍歷每條記錄, 結(jié)果是 字典 類(lèi)型
          
        

方式2:find() 查詢(xún)符合條件的所有數(shù)據(jù)

          
            query = owner.find(name='Tom')   # 查詢(xún)名為 Tom的數(shù)據(jù)
for obj in query:
    print(obj)        # 遍歷每條記錄, 結(jié)果是 字典 類(lèi)型
          
        

方式3:find_one() 查詢(xún)符合條件的 第一條 數(shù)據(jù)

          
            print(owner.find_one(name='Tom'))

注意一下,find_one 查出來(lái)結(jié)果就是一條字典。  不要再遍歷了,遍歷就出事了。。。
          
        

刪除數(shù)據(jù)

          
            result = owner.delete(name='Tom')
 
說(shuō)明:
    1. 若 delete() 不指定參數(shù),那么即為全部刪除。。慎用
    2. 返回值result的值, 代表刪除數(shù)據(jù)的條數(shù)


          
        

Json/CSV數(shù)據(jù) 導(dǎo)入到數(shù)據(jù)庫(kù)(只能聯(lián)用拓展的CRUD)

Json實(shí)例

我在當(dāng)前目錄下創(chuàng)建一個(gè) new_owner.json, 內(nèi)容如下:

          
            [
  {"name": "Alice", "age": 18},        
  {"name": "Zhang", "age": 30}
]
          
        

主文件代碼如下:

          
            new_owner = db['new_owner']    # 新建一張表,名為 new_owner
new_owner.thaw(
    filename='new_owner.json',   # 就是上面的那個(gè) json文件
    format='json'                # 指定格式為json, 默認(rèn)值是 csv
)
這樣就導(dǎo)入好了,數(shù)據(jù)庫(kù)內(nèi)容如下:
    +----+------+-------+
    | id | age  | name  |
    +----+------+-------+
    |  1 |   18 | Alice |
    |  2 |   30 | Zhang |
    +----+------+-------+
          
        

特殊情況分析: 假如基于上面創(chuàng)建好的數(shù)據(jù)庫(kù)與數(shù)據(jù), 將剛剛的json文件稍加改動(dòng),加個(gè) "gender"

          
            [
  {"name": "Alice", "age": 18, "gender": "man"},  
  {"name": "Zhang", "age": 30}
]
          
        

假如我們還是用上面的一模一樣的主文件代碼(我這里就不重復(fù)寫(xiě)了),導(dǎo)入剛修改的 新json數(shù)據(jù)。

          
            我們分析一下:
    我說(shuō)了,是在原有表 和 字段的 基礎(chǔ)上去導(dǎo)入新數(shù)據(jù)。 (原有數(shù)據(jù)庫(kù)字段為 name 和 age)
    但是今時(shí)不同往日。。。  我們剛剛的json新添加了一個(gè), gender。
    而原有的數(shù)據(jù)庫(kù)中,并沒(méi)有這個(gè)字段。 如果我們還是用之前的這個(gè)代碼:
    new_owner.thaw(
        filename='new_owner.json',   # 就是上面的那個(gè) json文件
        format='json'                # 指定格式為json, 默認(rèn)值是 csv
    )
    那么,peewee會(huì)自動(dòng)把這個(gè) 新 gender 鍵,同步到數(shù)據(jù)庫(kù),并生成 新字段 gender
        +----+------+-------+--------+
        | id | age  | name  | gender |
        +----+------+-------+--------+
        |  1 |   18 | Alice | NULL   |
        |  2 |   30 | Zhang | NULL   |
        |  3 |   18 | Alice | man    |
        |  4 |   30 | Zhang | NULL   |
        +----+------+-------+--------+    看見(jiàn)了把,gender字段,會(huì)自動(dòng)生成。

          
        

但是在某種情況下, 你并不想讓數(shù)據(jù)庫(kù) 創(chuàng)建這個(gè) 新字段
假如json中 "gender" , 它屬于一個(gè)臟數(shù)據(jù),我們不需要他,而是單純的想插入 name和age數(shù)據(jù)。
那么你可以,添加一個(gè) strict=True 參數(shù):

          
            new_owner.thaw(
    filename='new_owner.json',  
    format='json',               
    strict=True                # 看這里,添加一個(gè)這個(gè) strict=True就好了
)

strict=True意味著,它會(huì)對(duì)照json的key 與 數(shù)據(jù)庫(kù)的字段, 并以數(shù)據(jù)庫(kù)的字段為主,嚴(yán)格匹配插入。
          
        

CSV示例

其實(shí)和json的幾乎差不多,注意csv格式,逗號(hào)分隔,設(shè)置表頭。 new_owner.csv 內(nèi)容如下:

          
            name,age
Alice,18
Zhang,30
          
        

主文件代碼如下

          
            new_owner.thaw(
    filename='owner.csv',
    # format='csv'         # 我說(shuō)過(guò),format默認(rèn)參數(shù)就是csv,所以給不給format參數(shù)都行。
    # strict=True          # 嚴(yán)格匹配字段插入, 和上面講的json是一模一樣的作用。
)
          
        

最后說(shuō)個(gè)小細(xì)節(jié),不知道你有沒(méi)有注意,我們json和csv文件, 都沒(méi)有指定id。
雖然沒(méi)有指定,但是 peewee 同樣會(huì)為我們自動(dòng)創(chuàng)建 id (同樣也是 int(11), 主鍵, 自增)

數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)入到Json/CSV(只能聯(lián)用拓展的CRUD)

導(dǎo)入都說(shuō)完了,導(dǎo)出就更簡(jiǎn)單了。。就API變個(gè)名的事:
導(dǎo)出單個(gè)表的全部數(shù)據(jù):

          
            owner = db['owner']

owner.freeze(
    filename='new_owner.json',  
    format='json',  # 指定格式為json,   你要是不指定,默認(rèn)值是 csv
)
          
        

當(dāng)然,這里有個(gè)特色,導(dǎo)出方式還可以 導(dǎo)出某個(gè)查詢(xún)結(jié)果!!

          
            query = owner.find(name='Tom')
db.freeze(
    query,                      # 查詢(xún)結(jié)果,注意這個(gè)查詢(xún)結(jié)果,必須是個(gè)查詢(xún)集類(lèi)型。
    filename='new_owner.json', 
    format='json',  # 指定格式為json,   你要是不指定,默認(rèn)值是 csv
)
          
        

中場(chǎng)暫停。。。

至此,playhouse.dataset的DataSet里面的 新版CRUD,及其附屬功能(json導(dǎo)入導(dǎo)出等)講完。
也許你會(huì)很不適應(yīng)。 (這新版的CRUD,如果實(shí)在不能掌握,就當(dāng)了解即可)

最重要的還是第二篇文章的CRUD:https://segmentfault.com/a/11...
以下要講的,就是 第二篇文章講的,正常的 (from peewee import * )里面的 CRUD 相關(guān)的操作了。

信號(hào)(Signal)

官方只設(shè)定了如下 4 種信號(hào):
一、pre_save: 保存之前調(diào)用
二、post_save:保存之后調(diào)用

          
            pre_save 和 post_save只支持下面兩種API:
1. create()  # 創(chuàng)建數(shù)據(jù)
觸發(fā):
    Owner.create(name='Tom')  # create包含了 save() ,所以會(huì)自動(dòng)觸發(fā)
2. save()    # 更新數(shù)據(jù)
觸發(fā):
    obj = Owner.get(name='Butch')
    obj.name = 'Alice'
    obj.save()
注意: 你想用保存信號(hào),就必須用這兩種API,  用 update()是不好使的哦!!!!!!!!!!
          
        

三、pre_delete: 刪除數(shù)據(jù)之前調(diào)用
四、post_delete:刪除數(shù)據(jù)之后調(diào)用

          
            pre_delete 和 post_delete 只支持一種 API ,那就是  delete_instance()
觸發(fā):
    objs = Owner.select().where(Owner.name=='lin')
    for obj in objs:
        obj.delete_instance()

          
        

接下來(lái)我們開(kāi)始看代碼如何寫(xiě):
先把表和數(shù)據(jù)構(gòu)造出來(lái),還是老方式:

          
            from peewee import *

# 注意是 playhouse里的Model, 以及前面提到的 4 種 信號(hào)
from playhouse.signals import Model, post_save, pre_save, pre_delete, post_delete    


db = MySQLDatabase('test', user='root', password='123',
               host='IP', port=3306, charset='utf8mb4')
               
class Owner(Model):        
"""
    特別注意,這個(gè)Model, 使用是playhouse.signals下的 Model
    而不是 peewee 下的 Model, 這需要特別注意
    兩個(gè)模塊都有Model, 所以把用的Model放在 相對(duì)偏下面導(dǎo)入 
"""
                             
    data = IntegerField()    # 而字段依然是 from peewee import * 導(dǎo)入的
    class Meta:
        database=db
db.create_tables([Owner])
          
        

進(jìn)入正題:信號(hào)使用有兩種方式:
方式1(裝飾器方式):

          
            # 前面的4種信號(hào)的用法就是用來(lái),裝飾一個(gè)自定義函數(shù)。
# 這個(gè)自定義函數(shù)就是信號(hào)出發(fā)之后,為我們做事的。
# 接下來(lái)我以 post_save 為例 (當(dāng)然我這個(gè)例子只是強(qiáng)調(diào)一下語(yǔ)法,并沒(méi)有實(shí)用價(jià)值)

@pre_save(sender=Owner)  # sender指定 我們的模型類(lèi)
def aaa(model_class, instance, created=True):  # 這個(gè)名字隨便起
    """
        model_class:   就是 Owner這個(gè)類(lèi),默認(rèn)傳進(jìn)來(lái)方便你使用
        instance 和 create=True 照著寫(xiě)上就行不用管它
    """
    print(f"數(shù)據(jù)入庫(kù)之前我們捕獲了此表名=>{model_class}")
    for obj in model_class.select().dicts():   # model_class就是Owner類(lèi),它可以任意CRUD
        print(f"再次查看此表信息{obj}")

觸發(fā)信號(hào):
obj = Owner.get(name='Tom')
obj.name = 'Rose'
obj.save()

          
        

方式2 (函數(shù)連接):
信號(hào)-官檔:http://docs.peewee-orm.com/en...
其實(shí)你用 方式1 就行了。

數(shù)據(jù)庫(kù)反向生成 Python模型類(lèi)

參數(shù)官檔:http://docs.peewee-orm.com/en...
看好參數(shù)大小寫(xiě)就行(test是我的數(shù)據(jù)庫(kù)名):

          
            python -m pwiz -e mysql -H 192.6.6.6 -p 3306 -u root -P test > mymodel.py
# 指定了 -P ,密碼是后續(xù)命令行 追入的。
          
        

模型遷移 migration

我沒(méi)怎么看,需要的自己瞅瞅。。
模型遷移-官檔:http://docs.peewee-orm.com/en...

結(jié)束語(yǔ)

其實(shí)ORM都差不多。
Django:的ORM還算可以。但是不太好脫離框架單獨(dú)使用 (相當(dāng)于與Django平級(jí))。
sqlalchemy:沒(méi)怎么用過(guò)。之前看過(guò)幾眼。感覺(jué)極度不適。感覺(jué)學(xué)習(xí)成本有點(diǎn)高(相當(dāng)于與Python平級(jí))
peewee:是一個(gè)可單獨(dú)使用的簡(jiǎn)便的ORM框架(寫(xiě)web爬蟲(chóng)之類(lèi)的都能用得上,相當(dāng)于與Python平級(jí))

我感覺(jué):如果ORM的學(xué)習(xí)成本大于SQL的學(xué)習(xí)成本, 那倒不如精修一下SQL,即使換了環(huán)境也能用得上。
有時(shí)候高階ORM用多了,可能連SQL都不會(huì)寫(xiě)了。。。 (It's just for me......)

第一篇傳送門(mén):https://segmentfault.com/a/11...
第二篇傳送門(mén):https://segmentfault.com/a/11...


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論