PyQt5之SQLite数据库操作


**

1、连接数据库

**
导入库文件

from PyQt5 import QtSql
from PyQt5.QtSql import QSqlQuery

QtSql类即QT中的QSqlDatabase类,用于处理与数据库的连接
QSqlQuery类提供了执行和操作SQL语句打方法

连接sqlite数据库

database = QtSql.QSqlDatabase.addDatabase('QSQLITE')
database.setDatabaseName('test.db')
database.open()

没有test.db这个文件的时候则会在当前目录新建一个test.db文件
打开数据库,打开成功返回True

**

2、新建表

**
创建一个数据表,其中ID为主键

q = QSqlQuery()
sql_code = 'create table tbname (id int primary key, name varchar(30), age int)'
if q.exec_(sql_code):
    print('create a table')

**

3、插入数据

**
addBindValue()将值添加到列表中,调用顺序决定添加的顺序

q = QSqlQuery()
sql_code = 'insert into tbname values(1, "name", 15)'
if q.exec_(sql_code):
    print('succeed insert data')

**

4、查询

**
查询返回数据使用value(int)函数,例如select id,name,age from student value(0)等于返回id属性的值,value(2)等于age属性
exec_()查询成功返回true查询 否则返回false

可以使用
PySide.QtSql.QSqlRecord.indexOf(column_name)
函数来确定int的值

q = QSqlQuery()
sql_code = 'select id,name,age from tbname'
if q.exec(sql_code):
    id_index = q.record().indexOf('id')
    name_index = q.record().indexOf('name')
    age_index = q.record().indexOf('age')
    while q.next():
        id = q.value(id_index)
        name = q.value(name_index)
        age = q.value(age_index)
        print(id, name, age)

next()检索结果中的下一条记录(如果可用),并将查询放在检索到的记录上。请注意,结果必须处于活动状态,并且在调用此函数之前,isSelect()必须返回true,否则它将不执行任何操作并返回false。

当执行一个新的SQL语句,query将固定在一个有效的记录位置,你可以使用以下函数进行导航:
· QSqlQuery.next() # 逐条查询信息
· QSqlQuery.previous()
· QSqlQuery.first() # 查询首条信息
· QSqlQuery.last() # 查询最后一条信息
· QSqlQuery.seek()
这些函数提供了向前,向后 或任意查询返回记录的方法,你也可以用QSqlQuery.setForwardOnly()来设置仅向前查询记录。

一:使用exec()操作

指令执行成功则 exec_()会返回True并把查询状态设为活跃状态,否则返回false
另外对于SQLite,查询字符串一次只能包含一条语句。如果给出多个语句,则函数返回false

q = QSqlQuery()
sql_code = 'select id ,name,age from tbname'
if q.exec(sql_code):
    while q.next():
        id = q.value(0)
        name = q.value(1)
        age = q.value(2)
        print(id, name, age)

二:execBatch()操作
这个函数是批处理之前准备好的指令,如果数据库不支持批处理他会自己调用exec()来模拟

q = QSqlQuery()
sql_code = 'select id,name,age from tbname'
q.prepare(sql_code)
q.addBindValue([6,7,8])
q.addBindValue(['test5','test6','test7'])
q.addBindValue([1,1,1])
if q.execBatch():
    print("inserted ")

三:executedQuery()返回最后一个执行成功的指令

q = QSqlQuery()
sql_code = 'select id ,name,age from tbname'
if query.exec(sql_code):
    while query.next():
        id = query.value(0)
        name = query.value(1)
        age = query.value(2)
        print(id, name, age)
print(query.executedQuery())

四: 其他

finish()终止当前的操作

如果成功执行SQL语句,设置query 的状态为活动的,所以PySide.QtSql.QSqlQuery.isActive()返回true,否则查询状态设为非活动的。

**

5、获取SQLite数据库中的表信息

**

1.查询所有表名信息:

select * from sqlite_master
select * from sqlite_sequence

SQLite数据库中的信息存在于一个内置表sqlite_master中,在查询器中可以用:select * from sqlite_master来查看,如果只要列出所有表名的话,则只要一个语句:

SELECT name FROM sqlite_master WHERE type='table' order by name

因为表的列type固定为table。

2.返回tables数据表的数量

select count(*) from sqlite_sequence
select count(*) from sqlite_master

3.返回指定表的字段信息

pragma table_info(table_name)

**

6、插入字段

**
数据表中插入字段(列)

ALTER TABLE tablename ADD columm type

7、示例代码

SQLite_tools.py

def create_SQL(sqlname):
    '''
    创建数据库
    :param sqlname: 数据库目录名称
    '''
    database = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    database.setDatabaseName(sqlname)
    database.open()

def create_SQLtable(tbname):
    '''
    创建通用数据表,默认第一列为主键,名称:ID,类型:INTEGER, 自增
    :param tbname: 数据表名称
    '''
    # CREATE TABLE if not exists 表名 (ID INTEGER PRIMARY KEY AUTOINCREMENT);
    q = QSqlQuery()
    command = u"CREATE TABLE if not exists {} (ID INTEGER PRIMARY KEY AUTOINCREMENT);".format(tbname)
    q.exec_(command)

def add_SQLtable_cloumn(tbname, column_name, genre):
    '''
    指定数据表添加列
    :param tbname: 表名
    :param column_name: 列名
    :param genre: 添加列类型
    '''
    # ALTER TABLE 表名 ADD 列名 列类型;
    q = QSqlQuery()
    command = u"ALTER TABLE {} ADD {} {};".format(tbname, column_name, genre)
    q.exec_(command)

def add_SQLtable_row(tbname, row_num):
    '''
    指定数据表添加行
    :param tbname: 表格名称
    :param row_num: 行数
    '''
    # INSERT INTO 表名 (ID) VALUES (行);
    q = QSqlQuery()
    for row in range(1, row_num + 1):
        command = "INSERT INTO {} (ID) VALUES ({});".format(tbname, str(row))
        q.exec_(command)

def set_SQLtable_value(tbname, column, row, value):
    '''
    更新数据表指定位置的值
    :param tbname: 数据表名称
    :param row: 行数
    :param column: 列数
    :param value: 值
    '''
    # UPDATE 表名 SET 列名=值 WHERE ID=行;
    q = QSqlQuery()
    command = u"UPDATE {} SET {}='{}' WHERE ID={};".format(tbname, column, value, str(row))
    q.exec_(command)

def get_SQLtable_value(tbname, column, row):
    '''
    读取指定数据表的指定列行数据
    :param tbname: 数据表名称
    :param row: 数据表行
    :param column: 数据表列
    :return 返回查询到的值
    '''
    # SELECT 列名 FROM 表名 WHERE ID = 行号;
    q = QSqlQuery()
    command = "SELECT {} FROM {} WHERE ID={};".format(column, tbname, str(row))
    q.exec_(command)
    if q.next():
        result = q.value(0)
        return result

def get_SQLtable_column(tbname, column):
    '''
    读取数据表指定列的所有数据
    :param tbname: 数据表名称
    :param column: 列名称
    :return 返回查询到的值列表
    '''
    # SELECT 列名 FROM 表名;
    q = QSqlQuery()
    command = "SELECT {} FROM {};".format(column, tbname)
    value_list = []
    if q.exec_(command):
        column_index = q.record().indexOf(column)  # 获取列索引值
        while q.next():
            value = q.value(column_index)
            value_list.append(value)
    return value_list

def get_SQLtable_column_name(tbname):
    '''
    获取数据表字段名字
    :param tbname: 数据表名称
    :return: 返回字段(列)名称列表
    '''
    q = QSqlQuery()
    command = "pragma table_info({})".format(tbname)
    name_list = []
    if q.exec_(command):
        while q.next():
            column_name = q.value(1)
            name_list.append(column_name)
    return name_list

def get_SQLtable_row(tbname, row):
    '''
    读取数据表指定行的所有数据
    :param tbname: 数据表名称
    :param column: 行名称
    :return 返回查询到的值列表
    '''
    # SELECT * FROM 表名 WHERE ID = 行号;
    name_list = get_SQLtable_column_name(tbname)
    num = len(name_list) - 1
    q = QSqlQuery()
    command = "SELECT * FROM {} WHERE ID={};".format(tbname, str(row))
    value_list = []
    if q.exec_(command):
        while q.next():
            for i in range(1, num):
                value = q.value(i)
                value_list.append(value)
    return value_list

def delete_SQLtable_value(tbname):
    '''
    清空指定数据表
    :param tbname: 表名
    '''
    # DELETE FROM table_name WHERE[condition];
    q = QSqlQuery()
    command = "DELETE FROM " + tbname + ";"
    q.exec_(command)

PyQt5_SQLite.py

# coding:utf-8

from PyQt5 import QtSql
from PyQt5.QtSql import QSqlQuery

from SQLite_tools import *


db_name = './PtQt5_SQLite.db'
create_SQL(db_name)
tablename = "year"
create_SQLtable(tablename)

#添加12列
for i in range(1, 13):
    month = "month" + str(i)
    add_SQLtable_cloumn(tablename, month, "text")

# 添加31行
add_SQLtable_row(tablename, 31)

# 设置每行每列的值
for i in range(1, 13):
    month = "month" + str(i)
    for j in range(32):
        day = str(j)
        set_SQLtable_value(tablename, month, day, "0")

# 修改 month3 列 13行 的值
set_SQLtable_value(tablename, "month3", "13", "0 1 2 3 4 5 6 7 8 9")

#读取指定位置的值
s1 = get_SQLtable_value(tablename, "month3", "13")
print('s1', s1)

#读取数据表整列的值
s2 = get_SQLtable_column(tablename, "month3")
print('s2', s2)

#读取数据表整行的值
s3 = get_SQLtable_row (tablename, '13')
print('s3', s3)
发布了34 篇原创文章 · 获赞 54 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42686768/article/details/87992476