**
导入库文件
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
**
**
创建一个数据表,其中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')
**
**
addBindValue()将值添加到列表中,调用顺序决定添加的顺序
q = QSqlQuery()
sql_code = 'insert into tbname values(1, "name", 15)'
if q.exec_(sql_code):
print('succeed insert data')
**
**
查询返回数据使用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,否则查询状态设为非活动的。
**
**
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)
**
**
数据表中插入字段(列)
ALTER TABLE tablename ADD columm type
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)