PySide6+Sqlite3增删改查

  用PySide6和Sqlite3写了一个demo,具备基本的增删改查功能。

 

 

话不多说,贴上代码:

Main.py

import sys

from PySide6.QtCore import QRect, QSize
from PySide6.QtGui import QIcon, QCursor, QAction, QKeySequence, Qt
from PySide6.QtWidgets import (QApplication, QWidget, QVBoxLayout,
                               QTreeWidget, QTreeWidgetItem, QHBoxLayout, QPushButton, QMenu, QToolButton, QFrame,
                               QTableWidget, QSpacerItem, QSizePolicy, QLineEdit, QTableWidgetItem, QAbstractItemView,
                               QStyleFactory)

from demo.sqlite3 import SqliteDB
from demo.sqlite3.UserEditDialog import UserEditDialog


class MainWindow(QWidget):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setWindowTitle("Sqlite3增删改查")
        self.resize(600, 432)

        self.verticalLayout = QVBoxLayout(self)
        self.frame = QWidget(self)
        self.horizontalLayout = QHBoxLayout(self.frame)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)

        self.createButton = QPushButton("新建", self.frame)
        self.horizontalLayout.addWidget(self.createButton)
        self.createButton.clicked.connect(self.createUser)

        self.modifyButton = QPushButton("修改", self.frame)
        self.horizontalLayout.addWidget(self.modifyButton)
        self.modifyButton.clicked.connect(self.modifyUser)

        self.deleteButton = QPushButton("删除", self.frame)
        self.horizontalLayout.addWidget(self.deleteButton)
        self.deleteButton.clicked.connect(self.deleteUser)

        self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(self.horizontalSpacer)

        self.searchLineEdit = QLineEdit(self.frame)
        self.horizontalLayout.addWidget(self.searchLineEdit)

        self.searchButton = QPushButton("查询", self.frame)
        self.horizontalLayout.addWidget(self.searchButton)
        self.searchButton.clicked.connect(self.searchUser)

        self.verticalLayout.addWidget(self.frame)
        self.tableWidget = QTableWidget(self)
        self.verticalLayout.addWidget(self.tableWidget)
        # 设置表头是否显示
        self.tableWidget.verticalHeader().setVisible(False)
        self.tableWidget.horizontalHeader().setVisible(True)
        # 设置行数
        self.tableWidget.setRowCount(0)
        # 设置列数
        self.tableWidget.setColumnCount(6)
        # 设置是否显示网格线
        self.tableWidget.setShowGrid(True)
        # 设置最后一列宽度自动填充
        self.tableWidget.horizontalHeader().setStretchLastSection(True)
        # 设置水平表头标签
        self.tableWidget.setHorizontalHeaderLabels(['ID', '姓名', '性别', '年龄', '手机', '邮箱'])
        # 设置垂直表头内容居中显示
        self.tableWidget.horizontalHeader().setDefaultAlignment(Qt.AlignCenter)
        # 将表格变为禁止编辑
        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
        # 用于控制当选择了tableView视图中数据项时,对应的表头区域是否高亮,默认高亮显示
        self.tableWidget.verticalHeader().setHighlightSections(False)
        self.tableWidget.horizontalHeader().setHighlightSections(False)
        # 设置表格整行选中
        self.tableWidget.setSelectionMode(QAbstractItemView.SingleSelection)
        # self.setSelectionMode(QAbstractItemView.ContiguousSelection)
        self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)

        self.tableWidget.setColumnWidth(0, 30)
        self.tableWidget.setColumnWidth(1, 70)
        self.tableWidget.setColumnWidth(2, 40)
        self.tableWidget.setColumnWidth(3, 40)
        self.tableWidget.setColumnWidth(4, 100)
        self.tableWidget.setColumnWidth(5, 120)
        # self.tableWidget.hideColumn(0)

        user_list = SqliteDB.FindAllUser()
        self.loadUsers(user_list)

    def loadUsers(self, user_list):
        self.tableWidget.clearContents()
        self.tableWidget.setRowCount(len(user_list))
        sex = ['男', '女']
        for i, row in enumerate(user_list):
            item = QTableWidgetItem(str(row[0]))
            self.tableWidget.setItem(i, 0, item)

            item = QTableWidgetItem(row[1])
            self.tableWidget.setItem(i, 1, item)

            item = QTableWidgetItem(sex[row[2]])
            item.setTextAlignment(Qt.AlignCenter)
            self.tableWidget.setItem(i, 2, item)

            item = QTableWidgetItem(str(row[3]))
            item.setTextAlignment(Qt.AlignCenter)
            self.tableWidget.setItem(i, 3, item)

            item = QTableWidgetItem(row[4])
            self.tableWidget.setItem(i, 4, item)

            item = QTableWidgetItem(row[5])
            self.tableWidget.setItem(i, 5, item)

        return user_list

    def createUser(self):
        dialog = UserEditDialog(self, '新建')
        dialog.exec()
        if dialog.user_dict:
            SqliteDB.SaveUser(dialog.user_dict)
            user_list = SqliteDB.FindAllUser()
            self.loadUsers(user_list)

    def modifyUser(self):
        selectedItems = self.tableWidget.selectedItems()
        if selectedItems:
            userid = selectedItems[0].text()
            user = SqliteDB.FindOneByID(userid)
            dialog = UserEditDialog(self, '修改')
            dialog.setData(user)
            dialog.exec()
            if dialog.user_dict:
                SqliteDB.Update(userid, dialog.user_dict)
                user_list = SqliteDB.FindAllUser()
                self.loadUsers(user_list)

    def deleteUser(self):
        selectedItems = self.tableWidget.selectedItems()
        if selectedItems:
            userid = selectedItems[0].text()
            SqliteDB.DeleteUser(userid)
            row = self.tableWidget.row(selectedItems[0])
            self.tableWidget.removeRow(row)

    def searchUser(self):
        user_dict = {}
        condition = self.searchLineEdit.text()
        if condition:
            user_dict['id'] = condition
            user_dict['name'] = condition
            if condition == '男':
                user_dict['sex'] = 0
            if condition == '女':
                user_dict['sex'] = 1
            user_dict['age'] = condition
            user_dict['mobile'] = condition
            user_dict['email'] = condition

        user_list = SqliteDB.FindUserByConditions(user_dict)
        self.loadUsers(user_list)


if __name__ == "__main__":
    app = QApplication([])
    app.setStyle(QStyleFactory.create('Fusion'))
    window = MainWindow()
    window.show()
    sys.exit(app.exec())

 Sqlite3DB.py

from dbutils.persistent_db import PersistentDB
import sqlite3


class Pool(object):  # 数据库连接池
    __pool = None  # 记录第一个被创建的对象引用
    config = {
        'database': 'user.db'  # 数据库文件路径
    }

    def __new__(cls, *args, **kwargs):
        """创建连接池对象  单例设计模式(每个线程中只创建一个连接池对象)  PersistentDB为每个线程提供专用的连接池"""
        if cls.__pool is None:  # 如果__pool为空,说明创建的是第一个连接池对象
            cls.__pool = PersistentDB(sqlite3, maxusage=None, closeable=False, **cls.config)
        return cls.__pool


class Connect:
    def __enter__(self):
        """自动从连接池中取出一个连接"""
        db_pool = Pool()
        self.conn = db_pool.connection()
        self.cur = self.conn.cursor()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        """自动释放当前连接资源 归还给连接池"""
        self.cur.close()
        self.conn.close()


# 保存一条记录
def SaveUser(data_dict):
    data = []
    fields = ''
    values = ''

    for k, v in enumerate(data_dict):
        fields = fields + v
        values = values + '?'
        if k < len(data_dict) - 1:
            fields = fields + ','
            values = values + ','
        data.append(data_dict[v])

    sql = f'INSERT INTO user ({fields}) VALUES({values})'
    with Connect() as db:
        db.cur.execute(sql, data)
        db.conn.commit()


# 查询指定表格所有数据
def FindAllUser():
    sql = 'SELECT * FROM user'
    with Connect() as db:
        db.cur.execute(sql)
        result = db.cur.fetchall()
    return result


def Update(id, data_dict):
    data = []
    sql = 'update user set '
    for k, v in enumerate(data_dict):
        sql = sql + v + ' = ?'
        if k < len(data_dict) - 1:
            sql = sql + ', '
        data.append(data_dict[v])
    sql = sql + ' where id = ' + str(id)
    with Connect() as db:
        db.cur.execute(sql, data)
        db.conn.commit()


# 根据ID删除一条记录
def DeleteUser(id):
    sql = f'DELETE FROM user WHERE id={id}'
    with Connect() as db:
        db.cur.execute(sql)
        db.conn.commit()


# 根据ID查询一条记录
def FindOneByID(id):
    sql = f'SELECT * FROM user WHERE id = {id}'
    with Connect() as db:
        db.cur.execute(sql)
        result = db.cur.fetchone()
    return result


# 执行一条SQL语句,查询多条记录
def FindAllBySQL(sql):
    with Connect() as db:
        db.cur.execute(sql)
        result = db.cur.fetchall()
    return result


# 根据ID查询
def FindUserByConditions(data_dict):
    sql = 'select * from user '
    condition = ''
    for k, v in enumerate(data_dict):
        if condition == '':
            condition = ' where '
        else:
            condition = f'{condition} or '

        if v == 'sex':
            condition = f'{condition} sex={data_dict[v]}'
        else:
            condition = f'{condition} {str(v)} like "%{data_dict[v]}%"'

    sql = sql + condition

    with Connect() as db:  # 从连接池中取出一个连接
        db.cur.execute(sql)
        result = db.cur.fetchall()

    return result

UserEditDialog.Py


from PySide6.QtCore import Qt
from PySide6.QtWidgets import QVBoxLayout, QLineEdit, QHBoxLayout, QSpacerItem, QSizePolicy, QPushButton, \
    QDialog, QFormLayout, QLabel, QRadioButton, QSpinBox, QMessageBox


class UserEditDialog(QDialog):
    def __init__(self, parent=None, title=None):
        super(UserEditDialog, self).__init__(parent)
        self.setWindowTitle(title)
        self.resize(300, 200)
        self.setWindowModality(Qt.ApplicationModal)
        self.user_dict = {}

        self.verticalLayout = QVBoxLayout(self)
        self.formLayout = QFormLayout()
        self.formLayout.setVerticalSpacing(10)
        self.formLayout.setHorizontalSpacing(10)

        self.label_1 = QLabel("姓  名", self)
        self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label_1)
        self.nameEditText = QLineEdit(self)
        self.formLayout.setWidget(0, QFormLayout.FieldRole, self.nameEditText)

        self.label_2 = QLabel("性  别", self)
        self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_2)

        self.radioButton_1 = QRadioButton("男", self)
        self.radioButton_1.setChecked(True)
        self.radioButton_2 = QRadioButton("女", self)

        self.horizontalLayout_1 = QHBoxLayout()
        self.horizontalLayout_1.addWidget(self.radioButton_1)
        self.horizontalLayout_1.addWidget(self.radioButton_2)

        self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_1.addItem(self.horizontalSpacer)

        self.formLayout.setLayout(1, QFormLayout.FieldRole, self.horizontalLayout_1)

        self.label_3 = QLabel("年  龄", self)
        self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_3)
        self.horizontalLayout_2 = QHBoxLayout()
        self.ageSpinBox = QSpinBox(self)

        self.horizontalLayout_2.addWidget(self.ageSpinBox)

        self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)

        self.horizontalLayout_2.addItem(self.horizontalSpacer_2)

        self.formLayout.setLayout(2, QFormLayout.FieldRole, self.horizontalLayout_2)

        self.label_4 = QLabel("手  机", self)
        self.formLayout.setWidget(3, QFormLayout.LabelRole, self.label_4)
        self.mobileEditText = QLineEdit(self)
        self.formLayout.setWidget(3, QFormLayout.FieldRole, self.mobileEditText)

        self.label_5 = QLabel("邮  箱", self)
        self.formLayout.setWidget(4, QFormLayout.LabelRole, self.label_5)
        self.emailEditText = QLineEdit(self)
        self.formLayout.setWidget(4, QFormLayout.FieldRole, self.emailEditText)

        self.verticalLayout.addLayout(self.formLayout)

        self.horizontalLayout = QHBoxLayout()
        self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(self.horizontalSpacer)

        self.okButton = QPushButton("确定", self)
        self.horizontalLayout.addWidget(self.okButton)

        self.cancelButton = QPushButton("取消", self)
        self.horizontalLayout.addWidget(self.cancelButton)

        self.okButton.clicked.connect(self.onOkButton)
        self.cancelButton.clicked.connect(lambda: self.close())

        self.verticalLayout.addLayout(self.horizontalLayout)

    def setData(self, user):
        print(user)
        self.nameEditText.setText(user[1])
        if user[2] == 0:
            self.radioButton_1.setChecked(True)
        elif user[2] == 1:
            self.radioButton_2.setChecked(True)
        self.ageSpinBox.setValue(user[3])
        self.mobileEditText.setText(user[4])
        self.emailEditText.setText(user[5])

    def onOkButton(self):
        if not self.nameEditText.text():
            QMessageBox().information(None, "提示", "请输入姓名", QMessageBox.Yes)
            return

        self.user_dict['name'] = self.nameEditText.text()
        sex = 0
        if self.radioButton_1.isChecked():
            sex = 0
        else:
            sex = 1
        self.user_dict['sex'] = sex
        age = self.ageSpinBox.value()
        self.user_dict['age'] = age
        self.user_dict['mobile'] = self.mobileEditText.text()
        self.user_dict['email'] = self.emailEditText.text()
        self.close()

数据库创建脚本:

CREATE TABLE [user](
  [id] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [name] VARCHAR(20), 
  [sex] INTEGER, 
  [age] INTEGER, 
  [mobile] VARCHAR(20), 
  [email] VARCHAR(50));

1. 安装数据库驱动程序 在使用 PySide2 连接数据库之前,需要先安装相应的数据库驱动程序。常见的数据库驱动程序有: - MySQL:mysql-connector-python - PostgreSQL:psycopg2 - SQLitesqlite3 安装驱动程序可以使用 pip 命令,例如安装 MySQL 驱动程序: ``` pip install mysql-connector-python ``` 2. 导入 PySide2 和数据库驱动程序 在代码中导入 PySide2 和相应的数据库驱动程序,例如: ```python from PySide2.QtSql import QSqlDatabase import mysql.connector ``` 3. 连接数据库 使用 QSqlDatabase 类连接数据库,例如连接 MySQL 数据库: ```python db = QSqlDatabase.addDatabase('QMYSQL') db.setHostName('localhost') db.setDatabaseName('test') db.setUserName('root') db.setPassword('password') if not db.open(): print('无法连接数据库') ``` 其中,`QMYSQL` 表示 MySQL 数据库,`localhost` 表示主机名,`test` 表示数据库名,`root` 表示用户名,`password` 表示密码。如果连接失败,会输出提示信息。 4. 执行 SQL 查询 使用相应的数据库驱动程序执行 SQL 查询,例如查询 MySQL 数据库中的数据: ```python cursor = db.cursor() cursor.execute('SELECT * FROM users') for row in cursor: print(row) ``` 其中,`users` 表示表名。执行 SQL 查询之后,可以遍历结果集并输出结果。 5. 关闭数据库连接 在程序结束时,需要关闭数据库连接: ```python db.close() ``` 完整代码示例: ```python from PySide2.QtSql import QSqlDatabase import mysql.connector # 连接 MySQL 数据库 db = QSqlDatabase.addDatabase('QMYSQL') db.setHostName('localhost') db.setDatabaseName('test') db.setUserName('root') db.setPassword('password') if not db.open(): print('无法连接数据库') # 查询数据 cursor = db.cursor() cursor.execute('SELECT * FROM users') for row in cursor: print(row) # 关闭数据库连接 db.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值