Форум сайта python.su
0
Всем привет.Я пытаюсь сделать множественный insert.Чтобы сделать это.
У меня есть переменная sql и она содержит в себе такой запрос:
sql = '''INSERT INTO items (res_id, log_id, link, title, content, n_date, nd_date, s_date, not_date)'''
values = ''' VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ''' % ( res_id, log_id, resource_link, item_title, item_content, n_date, nd_date, s_date, not_date)
INSERT INTO items (res_id, log_id, link, title, content, n_date, nd_date, s_date, not_date) VALUES ('35', '1', 'http://bryansk-news.net/society/2019/10/05/37343.html', 'Сегодня брянских водителей проверят на алкоголь', 'Сегодня брянских водителей проверят на алкоголь Сегодня, 07:14 5 октября ждать нетрезвых автомобилистов будут в районе д. 1 по проспекту Московскому в Фокинском районе. Останавливать транспортные средства будут с 23 часов 25 минут в течение получаса. Если вы стали свидетелем нарушений ПДД, сообщите об этом ближайшему наряду ДПС или в дежурную часть по телефону 74-71-02. Источник: https://news.nashbryansk.ru ', 'Added by Raha', '1570227276', '1570255714.6161082', '2019-10-05')
huge_insert = parser.huge_insert_db(result)
def huge_insert_db(self, result): self.cursor.execute(result) print('Запись 100 новостей успешно произведена!')
result_list = [] sql = '''INSERT INTO items (res_id, log_id, link, title, content, n_date, nd_date, s_date, not_date)''' values = ''' VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ''' % ( res_id, log_id, resource_link, item_title, item_content, n_date, nd_date, s_date, not_date) result = sql + values result_list.append(result) if len(result_list) == 100: huge_insert = parser.huge_insert_db(result)
Офлайн
857
r4khicТак нельзя делать, так как это можно использовать для инъекций. Нужно использовать защищённые поля.
И есть переменная values:values = ''' VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ''' % ( res_id, log_id, resource_link, item_title, item_content, n_date, nd_date, s_date, not_date)
r4khicДля таких вещей есть execute_many() обычно. То есть тебе надо где-то составить кортеж запросов, а потом передать его в многокомандный метод.
Вот сам метод:self.cursor.execute(result)
r4khicДаже если ты парсишь много ресурсов, это не значит, что их надо сваливать в одну кучу и потом выполнять одну большую команду. Нужно подготовить данные, в том числе и профильтровать их, и только потом, отфильтрованные, их можно писать в базу данных специальным методом, выполняющим множество команд за один раз.
Я парсю около 50 ресурсов,и я не знаю как сделать проверку.То есть проверку если в переменной result набралось 100 ссылок.То тогда производим множественный insert.
Офлайн
0
py.user.nextОкей.Я вас понял.Вот так изменил запрос.
Так нельзя делать, так как это можно использовать для инъекций. Нужно использовать защищённые поля.
sql = '''INSERT INTO items res_id, log_id, link, title, content, n_date, nd_date, s_date, not_date VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')''',( res_id, log_id, str(resource_link), str(item_title), str(item_content), str(n_date), nd_date, s_date, not_date )
py.user.nextЯ в курсе,но мне надо именно пока что без execute_many()
Для таких вещей есть execute_many() обычно. То есть тебе надо где-то составить кортеж запросов, а потом передать его в многокомандный метод.
py.user.nextНу я не говорил что у меня данные не подготовленные и не отфильтрованные данные.Наоборот у меня данные все подготовлены.
Даже если ты парсишь много ресурсов, это не значит, что их надо сваливать в одну кучу и потом выполнять одну большую команду. Нужно подготовить данные, в том числе и профильтровать их, и только потом, отфильтрованные, их можно писать в базу данных специальным методом, выполняющим множество команд за один раз.
Офлайн
857
Вот пример с записью нескольких строк
Для MySQL
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-executemany.html
data = [
('Jane', date(2005, 2, 12)),
('Joe', date(2006, 5, 23)),
('John', date(2010, 10, 3)),
]
stmt = "INSERT INTO employees (first_name, hire_date) VALUES (%s, %s)"
cursor.executemany(stmt, data)
cars = (
(1, 'Audi', 52642),
(2, 'Mercedes', 57127),
(3, 'Skoda', 9000),
(4, 'Volvo', 29000),
(5, 'Bentley', 350000),
(6, 'Citroen', 21000),
(7, 'Hummer', 41400),
(8, 'Volkswagen', 21600)
)
cur = con.cursor()
query = "INSERT INTO cars (id, name, price) VALUES (%s, %s, %s)"
cur.executemany(query, cars)
Офлайн
0
py.user.nextПонял ! Благодарю
Так что ты должен сделать сто кортежей и одну строку запроса. Затем один раз подать в execute_many() эту строку запроса и кортеж/список из этих ста кортежей. Это и есть подготовка. В методе записи данных в БД не должно быть никаких условий проверки на сто кортежей. Эти сто кортежей должны быть подготовлены снаружи метода и поданы в него, а от него требуется только их записать, подключившись к базе данных.
Офлайн