from PyQt5 import QtSql
from PyQt5.QtSql import QSqlQuery
db=QtSql.QSqlDatabase.addDatabase("QSQLITE")
db.setDatabaseName("mydatabase.db")
create_table_sql = f'''CREATE TABLE IF NOT EXISTS {"我的测试"} (
id INTEGER PRIMARY KEY,
mytxt TEXT NOT NULL,
date_time DATETIME,
int_value INT(4),
float_value REAL
)'''
db.open()
query = QSqlQuery()
print(query.exec(create_table_sql))
在数据库中创建表格时,需要先构造query
语句,然后实例化一个QSqlQuery
类,使然后调用这个实例化之后的类的exec()
方法,来执行构造好的query
语句。在执行前,需要打开数据库。
另外query.exec()
执行如果成功则会返回True
,否则为False
。
上面的代码执行后生成的表的结构如下:
插入数据的query
语句需要指定数据要插入 的表,要插入的数据。如果给定了要插入的列名,则只会插入对应的值。
import time,random
from PyQt5.QtCore import QDateTime
for i in range(60):
time_now = QDateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz")
query.exec(f'insert into {"我的测试"} values({"NULL"},"txt{i}","{time_now}",{random.randint(0,60)},{random.random()})')
time.sleep(0.5)
注意
query
语句,对于要插入的text数据,需要在该数据上添加引号。这里使用了f-string,大括号中的数据会先转化为字符串,比如txt{i}
,其格式化之后的字符串为txt1
(假设i为1),由于需要加引号所以需要如同上面代码中的一样添加引号。
由于我们的时间也是转化为字符串,所以同样要加引号。
time_now = QDateTime.currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz")
query.exec(f'insert into {"我的测试"} ("{"mytxt"}","{"date_time"}","{"int_value"}") values("insert","{time_now}",{100})')
print(query.exec(f'DELETE FROM 我的测试 WHERE mytxt="{"insert"}"'))
运行之后可以看到,表名为我的测试的表中,列mytxt中名为insert的行数据已经被删除。
下面的代码含义为,将表我的测试中,所有int_value值为16时,该行的float_value值设置为0。
print(query.exec(f'UPDATE 我的测试 SET float_value={0} WHERE int_value={16}'))
data_around_time = "select * from 我的测试 where date_time >= '2021-12-02 12:10:46.000' and date_time <= '2021-12-02 12:10:56.000'"
query.exec(data_around_time)
while query.next():
my_id = query.value('id')
int_value = query.value('int_value')
float_value = query.value('float_value')
date_time = query.value('date_time')
print(my_id, type(date_time), date_time, int_value, float_value)
上面的代码需要将时间在2021-12-02 12:10:46.000到2021-12-02 12:10:56.000之间的一些数据打印出来。
上面的查询语句也可以写成下面的形式:
"select * from 我的测试 where date_time between '2021-12-02 12:10:46.000' and '2021-12-02 12:10:56.000'"
这些数据对应在表中的值如下图:
打印出来的数据
注意:在查询一定时间范围的数据时,可以比较转换为字符串的时间数据,但是这些字符串的长度一定要一样,否则会出现问题。
另外,如果发现查询的数据不对时,一定好好看下自己的时间字符串,比如是否年月日处设置的不对。
文章QSqlDatabase使用相关说明中提到,要把下面的文件放置到.exe下,不然会缺少驱动无法连接到数据库,不会报错,但是就是一直连不上!
我测试了一下,不用把这些文件和使用pyinstall生成的exe放一起也是可以用的。
SQLite Studio,可以在https://sqlitestudio.pl/下载