使用变量

时间:2016-09-27 03:59:50

标签: python sql pyqt pyodbc pypyodbc

#Delete suspense window
class dWindow(QtGui.QMainWindow, Ui_dWindow):
    def __init__(self, parent = None):
        QtGui.QMainWindow.__init__(self, parent)
        self.setupUi(self)

        for row in cursor.execute("SELECT FIRSTNAME FROM Staff"):
            self.comboUser.addItems(row)
        con.close()

        self.btnDeleteSuspense.clicked.connect(self.btnDeleteSuspense_Clicked)

    def btnDeleteSuspense_Clicked(self):
        user = self.comboUser.currentText() #finds selected user
        date = self.dateEdit.date().toString("M/d/yyyy")
        numrecord = cursor.execute() ??

这是一个示例数据库和程序文件,以进一步帮助我解释

programsample

dbsample

我创建了变量来保存组合框和dateEdit框的选择。

下一步(我正在努力解决的问题)是在SQL查询中使用这些变量,这些变量将首先找到具有所选用户名的行数,并且日期< =而不是选中日期。这将填充numrecord变量,以便我可以显示"这将删除' x'行,你确定吗?"

如果用户选择yes,那么我将在删除查询中使用该变量来删除所选行。

我相信如果我能弄清楚如何在SQL查询中使用变量,那么DELETE查询应该相当简单。

可能的DELETE查询示例,以显示我尝试做的事情

cursor.execute("DELETE TO, count(*) FROM Suspense where TO = [user] and DATE = [date]")

我知道这是错的,但也许有助于澄清。

我希望我已完全解释了我的问题,并感谢您提供的任何帮助。

编辑:非常感谢!!

就在我看到你发布了这篇文章之前,我发现了它。

我想出的是以下内容:

qdate = self.dateTimeEdit.dateTime().toPyDateTime() #grabs the raw datetime from the QDateTimeEdit object and converts to python datetime

query = "SELECT DATE FROM Suspense WHERE DATE >= ?"  #creates the query using ? as a placeholder for variable

cursor.execute(query, (qdate,)) #executes the query and passes qdate as a tuple to the placeholder

有了这些知识,我可以重新创建我的查询以包含两个变量。

3 个答案:

答案 0 :(得分:1)

正如对另一个答案的评论中所提到的,您应该使用正确的参数化查询,例如:

# assumes that autocommit=False (the default)
crsr = conn.cursor()
sql = "DELETE FROM [Suspense] WHERE [TO]=? AND [DATE]<=?"
user = self.comboUser.currentText()  # as before
date = self.dateEdit.date()  # Note: no .toString(...) required
params = (user, date)
crsr.execute(sql, params)
msg = "About to delete {} row(s). Proceed?".format(crsr.rowcount)
if my_confirmation_dialog(msg):
    conn.commit()
else:
    conn.rollback()

答案 1 :(得分:1)

我想出的是以下内容:

qdate = self.dateTimeEdit.dateTime().toPyDateTime() #grabs the raw datetime from the QDateTimeEdit object and converts to python datetime

query = "SELECT DATE FROM Suspense WHERE DATE >= ?"  #creates the query using ? as a placeholder for variable

cursor.execute(query, (qdate,)) #executes the query and passes qdate as a tuple to the plac

有了这些知识,我现在可以根据需要将两个变量添加到查询中。

感谢大家的帮助,特别是戈登汤普森!

答案 2 :(得分:0)

您使用DELETE sql命令。

这假设您的DATE字段实际上是日期字段而不是字符串字段。

user = self.comboUser.currentText()
date = self.dateEdit.date().toString("yyyy-MM-dd")
cmd = "DELETE FROM Suspense WHERE TO = '{}' AND DATE >= '{}'".format(user, date)
cursor.execute(cmd)

此外,您可能希望研究使用ORM框架(sqlalchemy可能是最受欢迎的,但还有其他框架)。如果可能的话,最好避免手动构建SQL查询。