Найти - Пользователи
Полная версия: sqlite не получается добавить большое количество данных с Excel файла в .db
Начало » Базы данных » sqlite не получается добавить большое количество данных с Excel файла в .db
1
JekaPythonshik
 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
Блин, забыл добавить в конце:
     # сохраняем изменения
    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 раз выше, индекс в скобках не отображается))в коде он есть и в самой ошибке тоже, почему то тут не отображается))
py.user.next
row - это ряд (или строка)
col - это column, колонка (или столбец)

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

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

Так что переделай всё, исходя из этого.
JekaPythonshik
Так что переделай всё, исходя из этого.
/////
Спасибо, буду пробовать!)
JekaPythonshik
Все сделал!
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()
py.user.next
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
        ...
JekaPythonshik
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
Понял, спасибо!
mariahcarey
JekaPythonshik
Все сделал!py.user.next спасибо большое! Вот код, может кому пригодиться:
совершенно справедливо пишет
Immaculate Grid
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB