import sqlite3
import pandas as pd
= sqlite3.connect("data/auth.db")
conn = conn.cursor() cursor
37 sqlite
37.1 查看数据工具
- DB Browser for SQLite https://sqlitebrowser.org/dl/
37.2 非ORM模式操作
37.2.1 连接数据库
37.2.2 查找数据表的名称
其实sqlite有且只有一个表
"SELECT name FROM sqlite_master WHERE type='table';")
cursor.execute(= cursor.fetchall()
result if result:
= pd.DataFrame(result[0], columns=['table_name'])
df else:
= pd.DataFrame(result, columns=['table_name'])
df
df
table_name | |
---|---|
0 | user_account |
37.2.3 查看数据表的字段
= "user_account"
table_name f"PRAGMA table_info({table_name})")
cursor.execute(= cursor.fetchall()
result
for row in result:
= row[0]
cid = row[1]
name = row[2]
data_type = row[3]
not_null = row[4]
default_value = row[5]
is_pk print(f"Field Name: {name}")
print(f"Data Type: {data_type}")
print(f"Not Null: {not_null}")
print(f"Default Value: {default_value}")
print(f"Is Primary Key: {is_pk}")
print("--------------")
Field Name: username
Data Type: VARCHAR(255)
Not Null: 1
Default Value: None
Is Primary Key: 1
--------------
Field Name: role
Data Type: VARCHAR(255)
Not Null: 1
Default Value: None
Is Primary Key: 0
--------------
Field Name: password
Data Type: VARCHAR(255)
Not Null: 1
Default Value: None
Is Primary Key: 0
--------------
Field Name: password_md5
Data Type: VARCHAR(255)
Not Null: 1
Default Value: None
Is Primary Key: 0
--------------
Field Name: register_time
Data Type: DATETIME
Not Null: 1
Default Value: None
Is Primary Key: 0
--------------
37.2.4 更新数据
# 将用户名"admin"改为"管理员"
"UPDATE `user_account` SET `username` = '管理员' WHERE `username` = 'admin';")
cursor.execute(
# 提交更改
conn.commit()
37.2.5 插入和删除数据
## 插入一行管理员账号
from datetime import datetime
import hashlib
def str2md5(string):
# 创建MD5对象
= hashlib.md5()
md5_obj
# 更新MD5对象的内容
'utf-8'))
md5_obj.update(string.encode(
# 返回MD5哈希值
return md5_obj.hexdigest()
= '管理员'
username = '管理员'
role = 'admin'
password = str2md5('admin')
password_md5 = datetime.now()
register_time
# 检查是否存在admin用户
= "SELECT * FROM user_account WHERE username = '管理员'"
sql_check
cursor.execute(sql_check)
# 如果存在,则删除
if cursor.fetchone():
= "DELETE FROM user_account WHERE username = '管理员'"
sql_delete
cursor.execute(sql_delete)
# 插入新记录
= "INSERT INTO user_account (username, role, password, password_md5, register_time) VALUES (?, ?, ?, ?, ?)"
sql_insert
cursor.execute(sql_insert, (username, role, password, password_md5, register_time))
# 提交更改
conn.commit()
37.2.6 查询数据
"Select `username` From `user_account`;")
cursor.execute(
= cursor.fetchall()
result
pd.DataFrame(result).head()
0 | |
---|---|
0 | 中医肛肠科 |
1 | 中医针灸 |
2 | 乳腺科 |
3 | 产科 |
4 | 儿科 |
37.2.7 关闭数据库连接
# 关闭数据库连接
conn.close()
37.3 ORM操作实例
37.3.1 将pdf文件文本内容存入数据库
import pdfplumber
import os
import hashlib
import uuid
import json
from peewee import *
# 从文件夹获取相应文件类型的函数
def get_files_by_extension(folder_path, file_extension: str = ".pdf"):
= []
_files for file_name in os.listdir(folder_path):
if file_name.lower().endswith(file_extension.lower()):
_files.append(os.path.join(folder_path, file_name))return _files
# 创建文件hash字符的函数
def generate_file_hash(file_path):
with open(file_path, 'rb') as file:
= file.read()
file_data
= hashlib.sha256()
hash_object
hash_object.update(file_data)
= hash_object.hexdigest()
hash_string
return hash_string
# 创建数据库的函数
def createSqliteDB(DatabaseModel, safe):
'''
Usage Example: createSqliteDB(UploadFile)
DatabaseModel需要创建,如UploadFile
'''
# 创建数据表(safe=True,表示仅在表不存在时创建)
= safe)
DatabaseModel.create_table(safe
# 建立数据库Model
class KNOWDATA(Model):
= CharField(primary_key=True)
key = TextField()
row_data
class Meta:
= SqliteDatabase('assets/sqlite/KnowData.db')
database
@classmethod
def insert_data(cls, file_type, file_name, file_hash, page_number, file_content):
= str(uuid.uuid4())
key = {
data 'key': key,
'file_type': file_type,
'file_name': file_name,
'file_hash': file_hash,
'page_number': page_number,
'file_content': file_content
}
= json.dumps(data, ensure_ascii = False)
row_data =key, row_data=row_data)
cls.create(key
# 创建表, safe = True表示不重复创建,而是追加,safe = False,则是删除后重新创建数据库
= False)
createSqliteDB(KNOWDATA, safe
# 将pdf文件每页内容存入sqlite数据库
= "static/know_data_file/pdf"
pdf_folder
= get_files_by_extension(pdf_folder, ".pdf")
pdf_files
for pdf_file in pdf_files:
with pdfplumber.open(pdf_file) as pdf:
= 1
page_num for page in pdf.pages:
= page.extract_text()
file_content = pdf_file
file_name = page_num
page_number = os.path.splitext(file_name)[1]
file_type = generate_file_hash(file_name)
file_hash
+= 1
page_num
KNOWDATA.insert_data(file_type, file_name, file_hash, page_number, file_content)
print("数据库KNOWDATA已创建完毕!")
37.3.2 peewee Model
from peewee import *
# 建立数据库Model
class KNOWDATA(Model):
= CharField(primary_key=True)
key = TextField()
row_data
class Meta:
= SqliteDatabase('assets/sqlite/KnowData.db')
database
@classmethod
def insert_data(cls, file_type, file_name, file_hash, page_number, file_content):
= str(uuid.uuid4())
key = {
data 'key': key,
'file_type': file_type,
'file_name': file_name,
'file_hash': file_hash,
'page_number': page_number,
'file_content': file_content
}
= json.dumps(data, ensure_ascii = False)
row_data =key, row_data=row_data)
cls.create(key
@classmethod
def query_data(cls, search_term):
= cls.select(cls.row_data).where(
query
'$.page_content') ** f'%{search_term}%' # 模糊检索
fn.JSON_EXTRACT(cls.row_data,
)
= [json.loads(row.row_data) for row in query]
result_dicts_list
print(f"query_data_by_username_tablename.result_dicts_list[0]: {result_dicts_list[0]}")
return result_dicts_list