pyqt5数据库使用教程

1.关于连接sqlite数据库时使用QSqlTableModel模型查看具体数据

通过行号、列名称来获取某单元格的数据 注:model中的一行称为一条record,一列称为一条field

方法(1) 使用QSqlRecord类

QSqlRecord record;//获取model某行的所有内容
QSqlTableModel model;
record = model.record(2);//读取第2行的所有数据
QString name = record.value("name").toString();//从第2行中读出列名为name的那一列的数据

方法(2) 使用model自己的成员函数

  int columun_idx = model.fieldIndex("name");//获取列名为name的列的列号
  QModelIndex index = model.index(2,columun_idx);//定位到第2行,第columun_idx列
  QString name_str = model.data(index).toString();//读取数据

2.连接sqlite数据库相关方法

db = QtSql.QSqlDatabase.addDatabase('QMYSQL') #设置连接何种数据库
db.setHostName('主机名') #设置安装数据库的主机的名称
db.setDatabaseName('数据库名') #设置数据库的名称
db.setUserName('用户名') #输入用户名
db.setPassword('密码') #输入密码
db.setPort(3306) # 端口号
db.open() # 判断是否连接数据库成功 返回布尔值
commit():#提交事务,如果连接成功则返回true
rollback():#回滚事务
close():#关闭连接

PS:无法连接到数据库?

把mysql 的 libmySQL.dll 文件复制到 E:\Files\python\Lib\site-packages\PyQt5\Qt\bin 目录中 必须找到与 PyQt5 的位数相同或者低于 PyQt5,要不然会出现 Driver not loaded 错误。

3.QtSql查询方法

PySide.QtSql.QSqlQuery 提供执行SQL语句的方法。

PySide.QtSql.QSqlQuery 可以执行标准的DML或DDL,也可以执行专有的数据库语句。

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

当执行一个新的SQL语句,query将固定在一个有效的记录位置,你可以使用以下函数进行导航:

PySide.QtSql.QSqlQuery.next() # 逐条查询信息
PySide.QtSql.QSqlQuery.previous()
PySide.QtSql.QSqlQuery.first() # 查询首条信息
PySide.QtSql.QSqlQuery.last() # 查询最后一条信息
PySide.QtSql.QSqlQuery.seek()

这些函数提供了向前,向后 或任意查询返回记录的方法,你也可以用
PySide.QtSql.QSqlQuery.setForwardOnly()来设置仅向前查询记录。

获取记录内容可以使用 PySide.QtSql.QSqlQuery.value()方法
# 实例化一个查询对象
query = QtSql.QSqlQuery()
query = QSqlQuery("SELECT country FROM artist")
while query.next():
    country = query.value(0)
    print(country)
使用value(int)函数时,int表示字段的位置,起始值是0.
使用”select * from….”进行查询时,请注意字段位置所对应的int值,以免发生顺序错误。

在有些请况想引用具体字段的值,可以使用PySide.QtSql.QSqlQuery.record()、PySide.QtSql.QSqlRecord.indexOf()函数来确定int的值
query = QSqlQuery("SELECT * FROM artist")
fieldNo = query.record().indexOf("country")
while query.next():
    country = query.value(fieldNo)
    print(country)    

4.QSqlTableModel模型过滤方法

一、单个条件逐个过滤

self.model.setFilter(("userage = '%d'" % (age)))
self.model.setFilter(("username = '%s'" % (name)))

二、多个条件合并过滤

self.model.setFilter(("username = '%s' and userage = '%d'" % (name,age)))

5.设置QSqlTableModel模型中数据库中值的编辑策略

pyqt5数据库使用教程_第1张图片

6. 数据表查询实用方法

一、使用数据模型不绑定数据列表的方法

# 实例化一个可编辑数据模型
self.model = QtSql.QSqlTableModel()        #创建一个数据模型
self.model.setTable('usertb')               # 设置数据模型的数据表
self.model.setFilter(("username = '%s'" % ("student_ur")))#设置数据模型过滤条件(详见 4.QSqlTableModel模型过滤方法)
self.model.select()  # 查询符合上述条件的所有数据
data = self.model.record(0).value("password")  # 查询第0行(因为一般只有一个数据,所以只有一行),列名为password的那一项数据

预备知识:

成功执行SQL语句将查询的状态设置为活动状态,以便isActive()返回True。否则,查询的状态将设置为非活动状态。在任何一种情况下,执行新的SQL语句时,查询都位于无效记录上。必须先将活动查询导航到有效记录(以便isValid()返回True),然后才能检索值。

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

以下规则适用:

如果结果当前位于第一条记录之前,在执行查询后立即尝试检索第一条记录。
如果结果当前位于最后一条记录之后,则没有更改,并返回False。
如果结果位于中间某处,则尝试检索下一条记录。
如果无法检索记录,则结果将定位在最后一条记录之后,并返回False。 如果成功检索到记录,则返回True。

使用以下功能执记录:

.first()函数:
检索结果中的第一条记录(如果可用),并将查询定位在检索到的记录上。 请注意,结果必须处于活动状态,并且isSelect()必须在调用此函数之前返回True,否则它将不执行任何操作并返回False。 如果成功则返回True。 如果不成功,则将查询位置设置为无效位置并返回False。

.last():
检索结果中的最后一条记录(如果可用),并将查询定位在检索到的记录上。 请注意,结果必须处于活动状态,并且isSelect()必须在调用此函数之前返回True,否则它将不执行任何操作并返回False。 如果成功则返回True。 如果不成功,则将查询位置设置为无效位置并返回False。

.seek(index, relative = False):
检索位置索引处的记录(如果可用),并将查询定位在检索到的记录上。第一个记录位于位置0。请注意,查询必须处于活动状态,并且isSelect()必须在调用此函数之前返回True。
这些函数允许程序员通过查询返回的记录向前,向后或任意移动。 如果您只需要继续查看结果(例如,使用next()),则可以使用setForwardOnly(),这将节省大量内存开销并提高某些数据库的性能。

二、使用QsqlQuery首先按列查找的方法

将活动查询定位在有效记录上后,可以使用value()检索数据。 使用QVariants从SQL后端传输所有数据。

要访问查询返回的数据,请使用value(int)。 SELECT语句返回的数据中的每个字段都是通过从0开始在语句中传递字段的位置来访问的。这使得使用SELECT *查询是不可取的,因为返回的字段的顺序是不确定的。

#一次检索一条数据
query = QSqlQuery("SELECT password FROM usertb WHERE username = 'admin_ur'")
                                                    #查找password列的数据从usertb表中在username='adminur'时
while query.next():              #移动查找位置          #可以去掉while循环使用.first()或者.last()进行第一条数据定位
    country = query.value(0)  #逐个获取数据
    print(country)            #打印数据
#一次检索多条数据
query = QSqlQuery("SELECT identity,password  FROM usertb WHERE username = 'admin_ur'")
        while query.next():
            print(query.value(0))
            print(query.value(1))

三、使用QsqlQuery全部查找再限定的方法

为了提高效率,没有按名称访问字段的功能(除非您使用带有名称的预准备查询,如下所述)。要将字段名称转换为索引,请使用record()。indexOf()

#一次检索一条数据
query = QSqlQuery("SELECT * FROM usertb WHERE username = 'student_ur'")    #在用户名为student_ur的基础上查找所有列
        fieldNo = query.record().indexOf("password")                       #fieldNo表示在第几列找到student_ur
                                                                #找到password列对应的数据项
        while query.next():                                     #可以去掉while循环使用.first()或者.last()进行第一条数据定位
            pw = query.value(fieldNo)
            print(pw)
#一次检索多条数据
query = QSqlQuery("SELECT * FROM usertb WHERE username = 'student_ur'")
        fieldNo = query.record().indexOf("password")
        fieldNe = query.record().indexOf("identity")
        while query.next():
            print(query.value(fieldNo))
            print(query.value(fieldNe))

了解更多技术文章,欢迎关注我的个人公众号 pyqt5数据库使用教程_第2张图片

你可能感兴趣的:(pyqt5数据库使用教程)