Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 2, 2022 12:30:33

JekaPythonshik
Зарегистрирован: 2022-04-02
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite не получается добавить большое количество данных с Excel файла в .db

 import openpyxl
import sqlite3
#   читаем данные с файла excel
def example():
    """
    Один из способов чтения значений
    :return:
    """
    # создаем базу данных
    base = sqlite3.connect('testtovar.db')
    cur = base.cursor()
    base.execute("""CREATE TABLE IF NOT EXISTS product(
                    ID_TOVAR INT PRIMARY KEY,
                    TOVAR TEXT,
                    ID_ISG TEXT,
                    ISG TEXT,
                    COUNTRY TEXT,
                    BARCOD INT);
        """)
    base.commit()
    wb = openpyxl.reader.excel.load_workbook(filename="tovar.xlsx", data_only=True)
    sheet = wb.active   # Обращаемся к нужной таблице делаем ее активной для чтения
    # sheet = book.worksheets[1]    # таблицы можно получить из массива по индексу (индекс таблицы в файле)
    # Цикл по строкам начиная со второй (в первой заголовки)
    for row in range(1, 6, 1):
        # Объявление списка
        data = []
        # Цикл по столбцам от 1 до 6
        for col in range(1, 19079):
            # value содержит значение ячейки с координатами row, col
            value = sheet.cell(row, col).value
            # Список который мы будем добавлять
            data.append(value)
            # print(sheet['A' + str(col)].value, sheet['B' + str(col)].value, sheet['C' + str(col)].value,
                  # sheet['D' + str(col)].value, sheet['E' + str(col)].value, sheet['F' + str(col)].value)
        cur.execute("INSERT INTO product VALUES (?, ?, ?, ?, ?, ?);", data[19079])
Я новичок!
Подскажите пожалуйста с последней строчкой, я так понял мне нужно указывать индексы 19079 строчек что ли))если да, как это сделать, не писать же 19079 "дата" менял там индексы, переписывал по разному, изначально было так:
 cur.execute("INSERT INTO product VALUES (?, ?, ?, ?, ?, ?);", (data[0], data[1], data[2], data[3], data[4], data[5]))
так ошибок нет, но и в базу не добавляется, менял по разному, вставлял индекс 7 в скобки - писал “parameters are of unsupported type”,
вставлял индекс 0, пишет -
Incorrect number of bindings supplied. The current statement uses 6, and there are 8 supplied.
индекс 6 туже ошибку выдает что и при индексе 7, я запутался товарищи
Возможно связь где то теряется с базой, может как то переписать код, поэтому не добавляется, хотел через 3 разных файла каждый со своей функцией, пока чет не смог связать как раз добавление, не видит данные с других функций, надо разбираться.

Отредактировано JekaPythonshik (Апрель 2, 2022 12:38:18)

Прикреплённый файлы:
attachment tovar.xlsx (814,9 KБ)

Офлайн

#2 Апрель 2, 2022 13:01:50

JekaPythonshik
Зарегистрирован: 2022-04-02
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite не получается добавить большое количество данных с Excel файла в .db

Блин, забыл добавить в конце:

     # сохраняем изменения
    base.commit()
    # закрытие соединения
    base.close()
example()
сделал, юзанул, выдал ошибку:
Traceback (most recent call last):
File “D:\Programist\ProjectSQlite\venv\examples\__main__.py”, line 4, in <module>
import two_play
File “D:\Programist\ProjectSQlite\venv\examples\two_play.py”, line 48, in <module>
example()
File “D:\Programist\ProjectSQlite\venv\examples\two_play.py”, line 43, in example
cur.execute(“INSERT INTO product VALUES (?, ?, ?, ?, ?, ?);”, (data, data, data, data, data, data))
sqlite3.IntegrityError: UNIQUE constraint failed: product.ID_TOVAR
Однако(приложил скрин) непонятно почему именно эти данные, но добавились в базу
p.s. почему то на форуме где data - 6 раз выше, индекс в скобках не отображается))в коде он есть и в самой ошибке тоже, почему то тут не отображается))

Отредактировано JekaPythonshik (Апрель 2, 2022 13:03:11)

Прикреплённый файлы:
attachment Скрин.png (41,2 KБ)

Офлайн

#3 Апрель 2, 2022 23:23:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 8546
Репутация: +  762  -
Профиль   Отправить e-mail  

sqlite не получается добавить большое количество данных с Excel файла в .db

row - это ряд (или строка)
col - это column, колонка (или столбец)

Тебе нужно идти по рядам и брать по шесть колонок из каждого ряда. Когда берёшь колонку, добавляешь её в массив. Потом, когда шесть колонок набрано в массив, записываешь массив в базу данных.

JekaPythonshik
  
cur.execute("INSERT INTO product VALUES (?, ?, ?, ?, ?, ?);", data[19079])
  
cur.execute("INSERT INTO product VALUES (?, ?, ?, ?, ?, ?);", data)

Так что переделай всё, исходя из этого.



Офлайн

#4 Апрель 3, 2022 10:58:21

JekaPythonshik
Зарегистрирован: 2022-04-02
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite не получается добавить большое количество данных с Excel файла в .db

Так что переделай всё, исходя из этого.
/////
Спасибо, буду пробовать!)

Офлайн

#5 Апрель 4, 2022 15:28:52

JekaPythonshik
Зарегистрирован: 2022-04-02
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite не получается добавить большое количество данных с Excel файла в .db

Все сделал!
py.user.next спасибо большое! Вот код, может кому пригодиться:

 import openpyxl
import sqlite3
#   читаем данные с файла excel
def example():
    """
    Один из способов чтения значений
    :return:
    """
    # создаем базу данных
    base = sqlite3.connect('globaltest.db')
    cur = base.cursor()
    base.execute("""CREATE TABLE IF NOT EXISTS product(
                    ID_TOVAR INT,
                    TOVAR TEXT,
                    ID_ISG TEXT,
                    ISG TEXT,
                    COUNTRY TEXT,
                    BARCOD TEXT);
        """)
    # сохраняем БД
    base.commit()
    # читаем файл excel
    wb = openpyxl.reader.excel.load_workbook(filename="tovar.xlsx", data_only=True)
    sheet = wb.active   # Обращаемся к нужной таблице делаем ее активной для чтения
    # Цикл по строкам начиная со второй (в первой заголовки)
    for row in range(1, 19079, 1):
        # Объявление списка
        data = []
        # Цикл по столбцам с 1 по 6
        for col in range(1, 7, 1):
            # value содержит значение ячейки с координатами row, col
            value = sheet.cell(row, col).value
            # Список который мы будем добавлять
            data.append(value)
            # print(sheet['A' + str(col)].value, sheet['B' + str(col)].value, sheet['C' + str(col)].value,
                  # sheet['D' + str(col)].value, sheet['E' + str(col)].value, sheet['F' + str(col)].value)
        cur.execute("INSERT INTO product VALUES (?, ?, ?, ?, ?, ?);", (data))
    # сохраняем изменения
    base.commit()
    # закрытие соединения
    base.close()
example()

Офлайн

#6 Апрель 5, 2022 02:10:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 8546
Репутация: +  762  -
Профиль   Отправить e-mail  

sqlite не получается добавить большое количество данных с Excel файла в .db

JekaPythonshik
Вот код
У тебя там ошибка в количестве строк. Строк 19079, а переберёт он только с 1-ой по 19078-ую.

Так что пиши вот так всегда:
 for i in range(19079):
    for j in range(6):
        row = i + 1
        col = j + 1
        value = sheet.cell(row, col).value
        ...



Отредактировано py.user.next (Апрель 5, 2022 02:11:34)

Офлайн

#7 Апрель 5, 2022 23:46:33

JekaPythonshik
Зарегистрирован: 2022-04-02
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

sqlite не получается добавить большое количество данных с Excel файла в .db

py.user.next
Так что пиши вот так всегда:
for i in range(19079):
for j in range(6):
row = i + 1
col = j + 1
value = sheet.cell(row, col).value
Понял, спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version