通过行号、列名称来获取某单元格的数据 注:model中的一行称为一条record,一列称为一条field
QSqlRecord record;//获取model某行的所有内容
QSqlTableModel model;
record = model.record(2);//读取第2行的所有数据
QString name = record.value("name").toString();//从第2行中读出列名为name的那一列的数据
int columun_idx = model.fieldIndex("name");//获取列名为name的列的列号
QModelIndex index = model.index(2,columun_idx);//定位到第2行,第columun_idx列
QString name_str = model.data(index).toString();//读取数据
db = QtSql.QSqlDatabase.addDatabase('QMYSQL') #设置连接何种数据库
db.setHostName('主机名') #设置安装数据库的主机的名称
db.setDatabaseName('数据库名') #设置数据库的名称
db.setUserName('用户名') #输入用户名
db.setPassword('密码') #输入密码
db.setPort(3306) # 端口号
db.open() # 判断是否连接数据库成功 返回布尔值
commit():#提交事务,如果连接成功则返回true
rollback():#回滚事务
close():#关闭连接
把mysql 的 libmySQL.dll 文件复制到 E:\Files\python\Lib\site-packages\PyQt5\Qt\bin 目录中 必须找到与 PyQt5 的位数相同或者低于 PyQt5,要不然会出现 Driver not loaded 错误。
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)
self.model.setFilter(("userage = '%d'" % (age)))
self.model.setFilter(("username = '%s'" % (name)))
self.model.setFilter(("username = '%s' and userage = '%d'" % (name,age)))
# 实例化一个可编辑数据模型
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。
将活动查询定位在有效记录上后,可以使用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))
为了提高效率,没有按名称访问字段的功能(除非您使用带有名称的预准备查询,如下所述)。要将字段名称转换为索引,请使用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))