@ilya_k

Не понимаю, где ошибка при вставке значений в БД программой на Python?

Упрощенная версия исходного примера, в таблице бд 5 столбцов
CREATE TABLE `main_test` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `col_1` int NOT NULL,
  `col_2` varchar(20) NOT NULL,
  `col_3` varchar(20) NOT NULL,
  `col_4` varchar(20) NOT NULL,
  `col_5` varchar(40) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci


состав example.csv
csv_col1,csv_col2,csv_col3,csv_col4,csv_col5,
"15347","random_symb_1","1abc","1def","1AAAAAAAAAA",
"25347","random_symb_2","2abc","2def","2AAAAAAAAAA",
"3234","random_symb_3","3abc","3def","3AAAAAAAAAA",
"45677","random_symb_4","4abc","4def","4AAAAAAAAAA",
"55675","random_symb_5","5abc","5def","5AAAAAAAAAA",


есть переменная в которую считался набор данных из csv файла при помощи csv.DictReader
вывод line выглядят так:
{'csv_col1': '15347', 'csv_col2': 'random_symb_1', 'csv_col3': '1abc', 'csv_col4': '1def', 'csv_col5': '1AAAAAAAAAA', '': ''}
{'csv_col1': '25347', 'csv_col2': 'random_symb_2', 'csv_col3': '2abc', 'csv_col4': '2def', 'csv_col5': '2AAAAAAAAAA', '': ''}
{'csv_col1': '3234', 'csv_col2': 'random_symb_3', 'csv_col3': '3abc', 'csv_col4': '3def', 'csv_col5': '3AAAAAAAAAA', '': ''}
{'csv_col1': '45677', 'csv_col2': 'random_symb_4', 'csv_col3': '4abc', 'csv_col4': '4def', 'csv_col5': '4AAAAAAAAAA', '': ''}
{'csv_col1': '55675', 'csv_col2': 'random_symb_5', 'csv_col3': '5abc', 'csv_col4': '5def', 'csv_col5': '5AAAAAAAAAA', '': ''}


скорректировал программу с учетом ваших комментариев и документации и примеров (спасибо что ткнули носом, где смотреть
import csv
import pymysql

conn = pymysql.connect(
    user="test_user",
    password="u4534@F_18bbb",
    host="localhost",  
    database="example_sch",
    port=3306,
    )

with open("example.csv", "r", encoding="cp1251") as f:
    reader = csv.DictReader(f, delimiter=",")

    for line in reader:
        cursor = conn.cursor()
        sql_insert = "INSERT INTO `main_test` (`col_1`,`col_2`,`col_3`,`col_4`,`col_5`) VALUES (%s,%s,%s,%s,%s)"
        cursor.execute(sql_insert,(line["csv_col1"], line["csv_col2"], line["csv_col3"], line["csv_col4"], line["csv_col5"]))
        print(line)
    conn.commit()
    cursor.close()
    conn.close()

при таком коде все записи из csv вставились, спасибо за правки, хочу перенести в свой основной вопрос, вопрос из комментария:

предположим у меня 10 столбцов в таблице и все они созданы 1 к 1 с CSV файлом и последовательность сохранена, есть ли возможность не прописывать каждый из столбцов
вот в таком виде
sql_insert = "INSERT INTO `main_test` (`col_1`,`col_2`,`col_3`,`col_4`,`col_5`) VALUES (%s,%s,%s,%s,%s)"
cursor.execute(sql_insert,(line["csv_col1"], line["csv_col2"], line["csv_col3"], line["csv_col4"], line["csv_col5"]))


а как-то указать, что начиная от второго столбца (т.к. id нет в CSV) все столбцы брать подряд из line?
  • Вопрос задан
  • 109 просмотров
Решения вопроса 2
@bacon
почему ты прибежал сюда, а не пошел сначала читать доки? вот сходил за тебя почитать "If args is a list or tuple, %s can be used as a placeholder in the query. If args is a dict, %(name)s can be used as a placeholder in the query." https://pymysql.readthedocs.io/en/latest/modules/c...
Ответ написан
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Надо привести line, которое у вас есть dict, к типу tuple, например:
line = {'1': '1_value', '2': '3454358', '3': '3_value', '4': '313123','5':'5_value'}
data = tuple(line.values())
print(data)

и уж полученный кортеж передавать в execute

ну или так, если брать вашу попытку:
line = {'1': '1_value', '2': '3454358', '3': '3_value', '4': '313123','5':'5_value'}
data =(line["1"],line["2"],line["3"],line["4"],line["5"])
print(data)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы