@Katerina92_lomova

Как правильно список загрузить в базу данных MySQL через Python?

Добрый день!
Есть список - оч большой, его я выгружаю с определенного сайта.
По размеру он может быть всегда разный.
как правильно его вставлять в готовую MySQL таблицу?
ниже код.

import mysql.connector
from mysql.connector import Error

def create_connection(host_name, user_name, user_password):
    connection = None
    try:
        connection = mysql.connector.connect(
            host=host_name,
            user=user_name,
            passwd=user_password
        )
        print("Connection to MySQL DB successful")
    except Error as e:
        print(f"The error '{e}' occurred")

    return connection

connection = create_connection("localhost", "root", "3551989kate1")
def create_database(connection, query):
    cursor = connection.cursor()
    try:
        cursor.execute(query)
        print("Database created successfully")
    except Error as e:
        print(f"The error '{e}' occurred")
create_database_query = "CREATE DATABASE sm_app"
create_database(connection, create_database_query)

def execute_query(connection, query):
     cursor = connection.cursor()
     try:
         cursor.execute(query)
         connection.commit()
         print("Query executed successfully")
     except Error as e:
         print(f"The error '{e}' occurred")
create_users_table = """
CREATE TABLE IF NOT EXISTS vacancies (
  id INT AUTO_INCREMENT, 
  session_id INT, 
  time DATE, 
  title TEXT, 
  description TEXT,
  types TEXT,
  PRIMARY KEY (id)
) ENGINE = InnoDB
"""

execute_query(connection, create_users_table)

import requests # Модуль для обработки URL
from bs4 import BeautifulSoup # Модуль для работы с HTML
import time # Модуль для остановки программы
import matplotlib.pyplot as plt # Модуль для визуализации
from bs4 import BeautifulSoup as bs
import pandas as pd
num_of_page = 40
other_vacancies = []  # остальные вакансии будут валиться сюда
collected_data = [
  {'pattern': ['#c', 'c#','c#','#c','.net','core','#'], 'result': [] },
  {'pattern': ['ruby','ror','rails'], 'result': []},
  {'pattern': ['python','etl','питон'], 'result': []},
  {'pattern': ['php','рнр','битрикс','symphony','ravele','magento','yii','october','bitrix','symfony'], 'result': []},
  {'pattern': ['java','jаva','Java','spark'], 'result': []},
  {'pattern': ['javascript','node','js'], 'result': []},
  {'pattern': ['golang','разработчик go','go-разработчик','go','go разработчик'], 'result': []},
  {'pattern': ['c++','с++'], 'result': []},
  {'pattern': ['elixir'], 'result': []},
  {'pattern': ['scala'], 'result': []},
  {'pattern': ['rust'], 'result': []},
  {'pattern': ['kotlin'], 'result': []}
    

]

for i in range(num_of_page):
    URL ="https://career.habr.com/vacancies?divisions[]=backend&page=" + str(i+1)+ "&type=all"
    page = requests.get(URL)
    soup = bs(page.text, "html.parser")
    vacancies_names = soup.find_all('a', class_='vacancy-card__title-link')

    for name in vacancies_names:
        for data in collected_data:
            pattern_found = False
            if any([x in name.get_text().lower() for x in data['pattern']]):
                data['result'].append(name.get_text())
                pattern_found = True
                break
        if not pattern_found:
            other_vacancies.append(name.get_text())

sql = "INSERT INTO vacancies( title) VALUES ( %s)"
val = collected_data[0]['result']

cursor = connection.cursor()
cursor.executemany(sql, val)
connection.commit()


если я просто меняю в коде val на свой список(фото прилагаю ниже)
то ничего не работает.

6166e39100840906285119.jpeg
  • Вопрос задан
  • 388 просмотров
Пригласить эксперта
Ответы на вопрос 2
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
0) Посмотрите, как должно все работать - https://dev.mysql.com/doc/connector-python/en/conn...
1) очень большие запросы могут и не пройти, рекомендую отправлять в базу максимум по 1000 записей одновременно - разбивайте запрос по партициям
2) У вас в SQL ошибка, так работать не должно - поля не хватает
3) У вас запись с user_id, его нужно добавить в ваши данные.
Ответ написан
Vindicar
@Vindicar
RTFM!
Код в примере ожидает список из кортежей по два элемента.
Список на скриншоте состоит из одиночных строк. Так что либо данные кривые, либо вы не в тот запрос их подаёте.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы