У меня есть база данных sql, которую я тоже пытаюсь написать с помощью скрипта python. Этот скрипт Python анализирует переключатели DC, а затем выдает их в results_list. Затем я фильтрую ниже описание двух элементов и интерфейс.
Передняя часть приложения представляет собой фляжную страницу. У меня есть назначенные кнопки, которые будут запрашивать x кабинет и выполнять все вышеперечисленное. Я хочу отправить все данные ниже в базу данных sql. Я также хочу предотвратить дублирование/обновление таблицы, если элемент изменился.
прямо сейчас, когда я запускаю запрос, если рабочие параметры передаются в sql, а остальная часть сценария фляги обрабатывается. Когда я передаю параметры с несколькими элементами, я получаю следующую ошибку.
OperationalError: (1241, 'Operand should contain 1 column(s)')
рабочие параметры:
params = ([('TECH2_5750',)], [('Gi1/0/7',)], [(u'10.210.44.5',)])
не рабочие параметры:
params = ([('TECH2_5252',), ('TECH2_5261',), ('TECH2_5857',), ('TECH2_5278',), ('TECH2_5855',), ('TECH2_5207',), ('TECH2_6539',), ('TECH2_6363',), ('TECH2_5253',), ('TECH2_5030',), ('TECH2_6575',), ('TECH2_5839',), ('TECH2_6953',), ('TECH2_6133',), ('TECH2_5046',), ('TECH2_6152',), ('TECH2_5267',), ('TECH2_5847',), ('TECH2_5748',), ('TECH2_5104',), ('TECH2_5649',), ('TECH2_5103',)], [('Gi2/0/11',), ('Gi1/0/11',), ('Gi2/0/7',), ('Gi3/0/27',), ('Gi1/0/7',), ('Gi2/0/9',), ('Gi3/0/7',), ('Gi2/0/27',), ('Gi1/0/29',), ('Gi3/0/25',), ('Gi2/0/25',), ('Gi2/0/29',), ('Gi2/0/31',), ('Gi1/0/31',), ('Gi2/0/5',), ('Gi1/0/25',), ('Gi1/0/5',), ('Gi3/0/5',), ('Gi1/0/9',), ('Gi1/0/35',), ('Gi1/0/27',), ('Gi1/0/33',)], [(u'10.210.45.5',)])
код:
local1 = []
device1 = []
items = len(filtered_interface)
for item in range(0, items):
t = filtered_tech[item].split(' ')
hostname = t[1]
device1.append((hostname,))
t = filtered_interface[item].split(' ')
interfacelocal = t[1]
local1.append((interfacelocal,))
cab1 = []
cab1.append((cab,))
params = (device1, local1, cab1,)
connection1 = MySQLdb.connect(user = "user", passwd = "password", db = "db",host = "127.0.0.1")
mycursor = connection1.cursor()
sql = """
INSERT INTO devices (hostname, localint, cab) VALUES (%s, %s, %s)"""
mycursor.execute(sql, params)
connection1.commit()
mycursur.execute()
требует, чтобы params
имел такое же количество элементов, сколько у вас есть заполнителей в запросе. Поскольку у вас есть 3 заполнителя, params
должно иметь 3 элемента.
Если вы хотите вставить несколько строк, вам нужно использовать mycursor.executemany
. Это будет выполнять запрос повторно для каждого элемента последовательности параметров. params
должен быть двумерной последовательностью, где каждый элемент последовательности верхнего уровня представляет собой последовательность из 3 параметров для заполнения заполнителей.
params = [('TECH2_5252', 'Gi1/0/7', u'10.210.44.5'),
('TECH2_5261', 'Gi1/0/11', u'10.210.45.5'),
('TECH2_5857', 'Gi2/0/7', u'10.210.45.5'),
...]
sql = """
INSERT INTO devices (hostname, localint, cab) VALUES (%s, %s, %s)"""
mycursor.executemany(sql, params)
работает отлично, была проблема с моим списком, который нужно было сначала заархивировать, но потом все заработало, как и ожидалось.