2016-09-27 7 views
-1
#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() ?? 

Вот пример БД и файл программы для дальнейшего помочь мне объяснитьPython SQL запросы с использованием переменных

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 

С этим знанием я могу воссоздать мои запросы, чтобы включить обе переменные.

+0

Какова схема таблицы * ожидания? Является ли 'TO' строковым столбцом или столбцом внешнего ключа? –

+0

Строка столбца. Изображение dbsample представляет собой раздел таблицы ожидания, в котором показаны столбцы, на которые я буду нацеливаться с моими запросами, чтобы найти число строк, соответствующих переменным, и затем удалить эти строки. – ricketyCode

ответ

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-запросов, если это возможно.

+0

Я думаю, что я должен был уточнить лучше. Таблица «Персонал» не относится к запросу DELETE (таблица, на которую нацеливается DELETE, является «Suspense»), это просто для уточнения, какой пользователь находится в столбце TO. Я нацелен на выбор строк с TO и DATE, где DATE равно или старше выбранной даты. Первичный ключ таблицы Suspense - COUNTER, но я не думаю, что это полезно в этом случае, так как мне все равно, повторяются ли строки или нет. Я просто удаляю все строки для определенного пользователя, равного или старше указанная дата. – ricketyCode

+0

Итак, вы хотите удалить строки в таблице SUSPENSE, основываясь на выборе из таблицы STAFF? Извините, если я читаю это неправильно, но я не совсем проснулся. Если это так, вам нужно заглянуть в 'joins'. –

+0

@ ricketyCode Обновлено на основе ваших прав. –

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() 
+0

Большое спасибо! Я опубликовал редактирование, объясняющее, что я узнал, чтобы исправить это, прежде чем вы отправили сообщение. Кстати, как мне пометить кого-то с пространством в их имени? – ricketyCode

+0

@ricketyCode re: * «как мне пометить кого-то с пространством в их имени?» * - Вы можете просто использовать первые несколько символов (например, @Gord) при условии, что он однозначно идентифицирует участника в потоке комментариев. Если вы отправляете сообщения из веб-браузера, то после ввода «@» и первой буквы вы также должны получить всплывающее окно с действительными выборами (например, @GordThompson). –

+0

хорошо спасибо за вашу помощь! – ricketyCode

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 

Благодаря этим знаниям я могу теперь добавить обе переменные в запрос по мере необходимости.

Спасибо всем за помощь, особенно Горд Томпсон!