Peewee Sqlite3 中文模糊查詢

物聯網菜鳥發表於2020-10-15

最近在學習中出現一個問題:Peewee Sqlite3 中文模糊查詢失敗,看了許多帖子 大多沒有針對 peewee的,原生SQL是完全可以模糊查詢的,但是原生寫起來沒有orm舒服。

出問題的查詢方式:TableName.select().where(TableName.ColumnName % "%中文%")查詢,萬用字元 % 不多解釋,意思 是匹配0個或者1個或者多個字元。

更改之後的查詢方式:TableName.select().where(SQL("ColumnName like '%中文%'))

下面給出實驗過程,直接上完整程式碼

必備 peewee,SQL是peewee中的類

# -*- coding: utf-8 -*-
from peewee import *
import os
from playhouse.shortcuts import model_to_dict


##########################################################
# 資料庫部分,首先我們利用peewee建立表和插入資料
database = SqliteDatabase("lalala.db")

class UnknownField(object):
    def __init__(self, *_, **__): 
        pass

class BaseModel(Model):
    id = BigAutoField()#使用者id 非空 自增 主鍵
    createtime = DateTimeField(constraints=[SQL("DEFAULT CURRENT_TIMESTAMP")])#建立時間

    class Meta:
        database = database

# 使用者表
class WUsers(BaseModel):
    fullname = CharField()#使用者姓名 非空
    username = CharField()#使用者賬號 非空

    class Meta:
        table_name = 'W_Users'
###########################################################
# 寫個函式用於插入測試資料
def insertUser(fullname,username):
    try:
        database.connect(reuse_if_open=True)
        user = WUsers.get(WUsers.fullname==fullname)
        print("使用者已存在!")
    except WUsers.DoesNotExist:
        user_id=WUsers.insert({
            'fullname':fullname,
            'username':username
        }).execute()
        if user_id:
            print("新建使用者成功!")
        else:
            print("新建使用者失敗!")
    finally:
        database.close()
        
############################################################
# 常規方法 模糊查詢 中文和非中文
def QueryFullnameByWayOne():
    try:
        users = WUsers.select().where(WUsers.fullname % '%週一%')
        for user in users:
            user_dir=model_to_dict(user)
            print(user_dir)
    except Exception as e:
        print(e)
    finally:
        database.close()

def QueryUsernameByWayOne():
    try:
        users = WUsers.select().where(WUsers.username % '%1%')
        for user in users:
            user_dir=model_to_dict(user)
            print(user_dir)
    except Exception as e:
        print(e)
    finally:
        database.close()
############################################################

# 原生+Peewee 方法 模糊查詢 中文和非中文
def QueryFullnameByWayTwo():
    try:
        users = WUsers.select().where(SQL("fullname like '%週一%'"))
        for user in users:
            user_dir=model_to_dict(user)
            print(user_dir)
    except Exception as e:
        print(e)
    finally:
        database.close()

def QueryUsernameByWayTwo():
    try:
        users = WUsers.select().where(SQL("username like '%1%'"))
        for user in users:
            user_dir=model_to_dict(user)
            print(user_dir)
    except Exception as e:
        print(e)
    finally:
        database.close()
############################################################
if __name__ == "__main__":
    # 為了每次實驗 我這裡對上一次生產的資料庫進行刪除,避免報錯
    if os.path.exists("lalala.db"):
        os.remove("lalala.db")
        
    # 建立資料庫,並且插入資料
    database.create_tables([WUsers])
    insertUser("週一","123")
    insertUser("週二","456")
    insertUser("週三","789")
    insertUser("週四","1011")

    # Peewee 方法 模糊查詢中文和非中文
    print("QueryFullnameByWayOne")
    QueryFullnameByWayOne()
    print("QueryUsernameByWayOne")
    QueryUsernameByWayOne()
    
    # 原生+Peewee 方法 模糊查詢 中文和非中文
    print("QueryFullnameByWayTwo")
    QueryFullnameByWayTwo()
    print("QueryUsernameByWayTwo")
    QueryUsernameByWayTwo()

    # 我一度懷疑是不是 因為字元需要加引號,因此我再測試一下 WUsers.fullname % '"%週一%"'
    # 發現沒變,由此可以發現 利用 peewee 提供的 % 在Sqlite模糊查詢沒用
    

結果

至此,終於找到一個方法解決 利用peewee實現 模糊查詢的問題了,歡迎大家討論。 

相關文章