首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从QSqlQuery返回列名

从QSqlQuery返回列名
EN

Stack Overflow用户
提问于 2018-11-20 20:39:03
回答 1查看 592关注 0票数 0

我正在尝试创建一个小程序,它应该显示一个基于sqlite表的表视图,其中存储日期。传递有效性时,单元格显示红色以表示有效性已过期。我有一个方法"get_date_diff“,它检索电子邮件和过期日期,并将它们存储在列表中,以便稍后使用这些变量作为批处理发送邮件的变量。例如:电子邮件(var)的证书(var)在日期(Var)已过期。我的if声明给了我过期的日期和listes_pilotesmail_pilotes中的电子邮件,我需要在第三份清单中填写罪魁祸首证书:是在certificate1、certificate2栏中,还是两者都填写:

代码语言:javascript
复制
def get_date_diff(self):
    '''method to retrieve from DB expired certificates '''
    query = QSqlQuery("SELECT pilot_1,certificate1,certificate2,pilot_mail FROM Pilots")
    liste_pilotes = []
    mail_pilotes = []
    #certificate_expired = [] needs to be filled
    append_new = liste_pilotes.append
    append_new_mail = mail_pilotes.append
    while query_time.next():
        pilot_1 = query.value(0)
        date1 = query.value(1)
        date2 = query.value(2)
        pilot_mail = query.value(3)
        alter_certif1 = datetime.strptime(date1,"%Y-%m-%d")
        alter_certif2 = datetime.strptime(date2,"%Y-%m-%d")
        if alter_date1  < datetime.now() or alter_date2 < datetime.now():
            append_new(pilot_1)
            append_new_mail(pilot_mail)
    return liste_pilotes,mail_pilotes

表视图所基于的DB:

代码语言:javascript
复制
from PyQt5.QtSql import *

class LmtDataBase():
    def __init__(self):
        self.db = QSqlDatabase.addDatabase("QSQLITE")
        self.db.setDatabaseName("LmtPilots.db")

        self.db.open()

        query = QSqlQuery()
        query.exec_('''CREATE TABLE Pilots(id INTEGER PRIMARY KEY,pilot_1 TEXT, datetime1 TEXT, datetime2 TEXT,pilot_mail TEXT)''')

        self.db.commit()
        self.db.close()

        # ...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-20 22:37:26

这样做的目的是通过将日期存储在列表中来获取日期并进行比较,如果该列表至少有一个项,则保存其他数据:

代码语言:javascript
复制
from PyQt5 import QtCore, QtGui, QtWidgets, QtSql
import random
import string

def createConnection():
    db = QtSql.QSqlDatabase.addDatabase('QSQLITE')
    db.setDatabaseName(':memory:')
    if not db.open():
        return False

    query = QtSql.QSqlQuery()
    query.exec_('''CREATE TABLE Pilots(
        id INTEGER PRIMARY KEY, 
        pilot_1 TEXT, 
        certificate1 TEXT, 
        certificate2 TEXT,
        certificate3 TEXT,
        pilot_mail TEXT
        )''')

    for i in range(100):
        query.prepare("insert into Pilots values (?, ?, ?, ?, ?, ?)")
        query.addBindValue(i)
        query.addBindValue("".join(random.sample(string.ascii_letters, 15)))
        for j in range(3):
            days = random.randint(-10*365, 10*365)
            query.addBindValue(QtCore.QDate.currentDate().addDays(days))
        query.addBindValue("".join(random.sample(string.ascii_letters, 4) + ["@mail.com"]))
        if not query.exec_():
            print("error: ", query.lastError().text())
    return True

class DateDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super(DateDelegate, self).initStyleOption(option, index)
        t = QtCore.QDate.fromString(index.data(), "yyyy-MM-dd")
        if t < QtCore.QDate.currentDate():
            option.backgroundBrush = QtGui.QBrush(QtGui.QColor("red"))



class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        tableview = QtWidgets.QTableView()
        self.setCentralWidget(tableview)
        query = QtSql.QSqlQuery()
        query.exec_('''SELECT pilot_1, certificate1, certificate2, pilot_mail FROM Pilots''')
        model = QtSql.QSqlQueryModel(self)
        model.setQuery(query)
        tableview.setModel(model)
        for name in ('certificate1', 'certificate2'):
            ix = query.record().indexOf(name)
            delegate = DateDelegate(tableview)
            tableview.setItemDelegateForColumn(ix, delegate)
        print(self.get_date_diff())

    def get_date_diff(self):
        query = QtSql.QSqlQuery("SELECT pilot_1, certificate1, certificate2, pilot_mail FROM Pilots")
        rec = query.record()
        cols = [rec.indexOf(name) for name in  ("certificate1", "certificate2")]
        results = []
        while query.next():
            pilot_1 = query.value(rec.indexOf("pilot_1"))
            pilot_mail = query.value(rec.indexOf("pilot_mail"))
            dates = [QtCore.QDate.fromString(query.value(col), "yyyy-MM-dd") for col in cols]
            filter_columns = [col for col, date in zip(cols, dates) if date < QtCore.QDate.currentDate()]
            if filter_columns:
                v = [pilot_1, pilot_mail, filter_columns]
                results.append(v)
        return results

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    if not createConnection():
        sys.exit(-1)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53401151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档