Пример #1
0
 def deleteRows(self, listSelect):
     """Слот удаляет выделенные записи. В качестве параметра получает список выделенных строк таблицы."""
     setDelete = set()  # Множество удаляемых записей
     print(f"Количество удаляемых записей = {len(listSelect)}")
     for i in listSelect:
         print(f"Выбранный ряд:{i.row()}")
         print(self.content[i.row()])
         setDelete.add(str(self.content[i.row()][0]))
     #print(setDelete)
     if setDelete:
         deleteSQL = "DELETE FROM {} WHERE {} in ({})".format(
             self.getNameMainTable()[0], self.getFieldPrimaryKey(),
             ','.join(setDelete))
         #print(deleteSQL)
         connect = getConnection()
         try:
             cursor = connect.cursor()
             try:
                 cursor.execute(deleteSQL)
             except IntegrityError as e:
                 print(e.args)
             connect.commit()
         finally:
             connect.close()
         self.resetData()
Пример #2
0
 def fillContent(self, query):
     connection = getConnection()
     cursor = connection.cursor()
     cursor.execute(query)
     row = cursor.fetchone()
     while row is not None:
         self.content[row['id']] = row['value']
         row = cursor.fetchone()
     connection.close()
Пример #3
0
 def setSlaveTable(self, name_table):
     """ Установка названия подчиненной таблицы. Кроме того определяется названия поля, 
     являющегося первичным ключом подчиненной таблицы"""
     indexSQL = 'SHOW INDEX FROM {} WHERE Key_name="PRIMARY"'.format(
         name_table)
     connect = getConnection()
     cursor = connect.cursor()
     cursor.execute(indexSQL)
     row = cursor.fetchone()
     self.slave_index = row['Column_name']
Пример #4
0
 def paint(self, painter, option, index):
     painter.save()
     if (index.data()) and (not (index.data() == 'None')):
         SqlSelect = self._SqlSelectSlaveRecord.format(index.data())
         #print(SqlSelect)
         connect = getConnection()
         cursor = connect.cursor()
         cursor.execute(SqlSelect)
         row = cursor.fetchone()
         connect.close()
         painter.drawText(option.rect, Qt.AlignCenter,
                          str(self._function_view(row)))
     painter.restore()
Пример #5
0
 def paint(self, painter, option, index):
     painter.save()
     if (index.data()) and (not (index.data()
                                 == 'None')) and (self._primary_key):
         connect = getConnection()
         cursor = connect.cursor()
         selectSQL = self._query + " WHERE {} = {}".format(
             '.'.join(self._primary_key), index.data())
         #print(f"selectSQL={selectSQL}")
         cursor.execute(selectSQL)
         row = cursor.fetchone()
         connect.close()
         painter.drawText(option.rect, Qt.AlignCenter,
                          str(self._function_view(row)))
     painter.restore()
Пример #6
0
 def __init__(self, parent, name_table, function_view):
     """ В конструктор передаются имя подчиенной таблицы и функция над 
     связанной записью в подчиненной таблице"""
     self._function_view = function_view
     self._name_slave_table = name_table
     indexSQL = 'SHOW INDEX FROM {} WHERE Key_name="PRIMARY"'.format(
         name_table)
     connect = getConnection()
     cursor = connect.cursor()
     cursor.execute(indexSQL)
     row = cursor.fetchone()
     slave_index = row['Column_name']
     connect.close()
     self._SqlSelectSlaveRecord = "SELECT * FROM {} WHERE {} = {{}}".format(
         self._name_slave_table, slave_index)
     super().__init__(parent)
Пример #7
0
 def createTable(self):
     connect = getConnection()      
     self.query = "SELECT id_number, name_net, number FROM numbers" 
     tableQuery = QTableWidget()
     try:
         cursor=connect.cursor()
         numberRows = cursor.execute(self.query)
         tableQuery.setRowCount(numberRows)
         tableQuery.setColumnCount(3)
         content = cursor.fetchall()
         for i in range(len(content)):
             for j in range(len(content[i])):
                 #print(content[i][j])
                 tableQuery.setItem(i,j,QTableWidgetItem(str(list(content[i].values())[j])))
         tableQuery.setHorizontalHeaderLabels(("№", "Сеть", "Номер"))
     finally:
         connect.close()
     return tableQuery
Пример #8
0
 def setQuery(self, query):
     """Заголовки таблицы будут содержать имена полей запроса или их псевдонимы """
     self.query = query
     self.tableQuery.clear()
     connect = getConnection()      
     try:
         cursor=connect.cursor()
         numberRows = cursor.execute(self.query)
         descQuery = cursor.description # Здесь сохраняем описание полей запроса
         numberCols = len(descQuery)
         self.tableQuery.setRowCount(numberRows)
         self.tableQuery.setColumnCount(numberCols)
         content = cursor.fetchall()
         for i in range(len(content)):
             for j in range(len(content[i])):
                 self.tableQuery.setItem(i,j,QTableWidgetItem(str(list(content[i].values())[j])))
         self.tableQuery.setHorizontalHeaderLabels([field[0] for field in descQuery])
     finally:
         connect.close()
Пример #9
0
 def fill_content(self):
     self.content.clear()
     self.content[0] = '-----'
     con = getConnection()
     strSQL = "SELECT * FROM {}".format(self.tb_name)
     cursor = con.cursor()
     result = 0
     try:
         cursor.execute(strSQL)
         row = cursor.fetchone()
         while row is not None:
             result += 1
             self.content[row[list(row.keys())[0]]] = row[self.fd_name]
             row = cursor.fetchone()
     except:
         QMessageBox.critical(
             None, "Сообщение об ошибке",
             "Ошибка при выполнении запроса\n{}".format(strSQL))
     con.close()
     #print(self.content)
     return result
Пример #10
0
 def setQuery(self, strSQL):
     """ Метод принимает запрос к базе данных. Поле `content` заполняется результатами выполнения запроса.
     Поле `namesColumn` заполняется названиями полей запроса. Запрос записывается в поле `query`"""
     super().beginResetModel()
     self.query = strSQL
     connect = getConnection()
     try:
         cursor = connect.cursor()
         cursor.execute(self.query)
     finally:
         connect.close()
     #print(self.query)
     # Заполнение списка названий колонок таблицы.
     # Определяется по значению параметра `as` из SQL-запроса
     self.namesColumn.clear()
     for i in range(len(cursor.description)):
         self.namesColumn.append(cursor.description[i][0])
     self.fillSavedFields(self.getNameMainTable())
     # Заполнения поля content экземпляра класса.
     self.content.clear()
     row = cursor.fetchone()
     while row is not None:
         list_value = list(row.values())
         result_value = [
         ]  # Список значений одной записи результатов запроса
         for result in list_value:
             if isinstance(
                     result, date
             ):  #  Если тип данных datetime, то преобразовать их в строку
                 result_value.append(str(result))
             else:
                 result_value.append(result)
         self.content.append(result_value)
         #self.content.append(list(row.values()))
         #print(self.content)
         row = cursor.fetchone()
     super().endResetModel()
Пример #11
0
 def createFilterWidgets(self, layout):
     """Создание виджетов панели фильтрации. Виджеты создаются на основе содержимого fieldFilters"""
     if not self.fieldFilters:
         return
     #listLabels = []
     self.listWidgets = []
     for itemFilter in self.fieldFilters:
         print(itemFilter)
         layout.addWidget(QLabel(itemFilter[1]))
         if itemFilter[2] == "QComboBox":
             comboBox = QComboBox()
             comboBox.setObjectName("comboBox_"+itemFilter[0])
             comboBox.addItem('')
             self.listWidgets.append(comboBox)
             layout.addWidget(comboBox)
             connect = getConnection()      
             try:
                 cursor=connect.cursor()
                 cursor.execute(itemFilter[4])
                 result_row = cursor.fetchone()
                 #print("result_row = ", result_row)
                 while result_row is not None:
                     comboBox.addItem(list(result_row.values())[0])
                     result_row = cursor.fetchone()
             finally:
                 connect.close()
             comboBox.currentIndexChanged.connect(self.setFilter)#lambda:self.setFilter(comboBox.currentText()))
         elif itemFilter[2] == 'QLineEdit':
             lineEdit = QLineEdit()
             lineEdit.setObjectName("lineEdit_"+itemFilter[0])
             layout.addWidget(lineEdit)
             lineEdit.editingFinished.connect(self.setFilter)#lambda:self.setFilter(lineEdit.text()))
             self.listWidgets.append(lineEdit)
         elif itemFilter[2] == 'value':
             self.listWidgets.append(str(itemFilter[4]))
     return
Пример #12
0

if __name__ == '__main__':
    parser = createParser()
    namespace = parser.parse_args(sys.argv[1:])
    print("Выбрана команда {}".format(namespace.command))
    print(namespace)
    if namespace.table == 't':
        if namespace.command == 'create':
            adminConnect = mysqlconnector.getAdminConnection()
            init_servtables(adminConnect)
        if namespace.command == 'delete':
            delete_servtables()
    if namespace.command == 'create' and namespace.table == 'numbers':
        if namespace.bd == 'mysql':
            connect = mysqlconnector.getConnection()
        elif namespace.bd == 'sqlite3':
            connect = mysqlconnector.getConnectionLite()
        init_table_numbers(namespace.begin, namespace.end, namespace.net,
                           connect)
    if namespace.command == 'create' and namespace.table == 'phones':
        if namespace.bd == 'mysql':
            connect = mysqlconnector.getConnection()
        elif namespace.bd == 'sqlite3':
            connect = mysqlconnector.getConnectionLite()
        dict_parametrs = {
        }  # Словарь в котором содержатся данные полученные из ключей командной строки
        if namespace.pid:
            dict_parametrs['product_number'] = namespace.pid
        if namespace.iid:
            dict_parametrs['inv_number'] = namespace.iid
Пример #13
0
 def saveData(self):
     """Метод сохраняет содержимое модели в таблицу базы данных.
     для этого используется SQL-оператор, определяемый в переменной updateSQL """
     if not self.savedFields:
         print("Нечего сохранять")
         return
     #print("modifiedIndexes={}".format(self.modifiedIndexes))
     updateSQL = "UPDATE {} SET {} WHERE {}"
     insertSQL = "INSERT {} SET {}"
     connect = getConnection()
     try:
         print(f"Сохраняемые строки:{self.modifiedIndexes}")
         for record in self.modifiedIndexes:
             list_for_str = []
             name_main_table = self.getNameMainTable()
             for i in self.savedFields:  #(self.fillSavedFields(name_main_table)[1:]):
                 value = self.content[record][i]  #[0]]
                 if (i == 0) and (not value):
                     continue
                 if (value == None) or (value == 'None'):
                     #print(f"from saveData - {i}; value = {value}")
                     # Если подчиенная запись не выбрана, то соответствующее поле заполняем значением NULL
                     value = 'NULL'
                 elif isinstance(value, tuple):
                     # Если сохраняемые данные представляют собой tuple, значит это данные из подчиненной таблицы
                     # тогда сохраняем только первичный ключ записи подчиненной таблицы
                     value = value[0]
                 else:
                     value = "'{}'".format(value)
                 list_for_str.append("{} = {}".format(
                     self.savedFields[i], value))
                 #list_for_str.append("{} = {}".format(i[1], value))
             if self.content[record][0]:
                 SQL = updateSQL.format(
                     name_main_table[0], ", ".join(list_for_str),
                     "{}={}".format(self.getFieldPrimaryKey(),
                                    self.content[record][0]))
             else:
                 SQL = insertSQL.format(name_main_table[0],
                                        ", ".join(list_for_str))
             print(SQL)
             cursor = connect.cursor()
             ignoreExec = False
             successExec = False  # Переменная содержит результат выполнения SQL-запроса (успешно, неуспешно)
             while (not successExec) and (not ignoreExec):
                 try:
                     cursor.execute(SQL)
                 except IntegrityError as e:
                     print(e.args)
                     resDialog = QMessageBox.critical(
                         None, "Ошибка", f"Ошибка\n{e.args}",
                         QMessageBox.Retry | QMessageBox.Ignore)
                     print(f"resDialog = {resDialog}")
                     if resDialog == QMessageBox.Ignore:
                         ignoreExec = True
                 else:
                     successExec = True
         connect.commit()
     finally:
         connect.close()
     self.modifiedIndexes.clear()