Как вставить несколько тысяч столбцов в sqlite3? - PullRequest
3 голосов
/ 24 апреля 2010

Как и в моем последнем вопросе, но я столкнулся с проблемой, скажем, у меня есть простой словарь, как показано ниже, но его Большой, когда я пытаюсь вставить большой словарь, используя методы, описанные ниже, я получаю ошибку работы для c.execute (схема) слишком много столбцов, так какой должен быть мой альтернативный метод для заполнения столбцов базы данных sql? Используя команду alter table и добавьте каждую по отдельности?

import sqlite3
con = sqlite3.connect('simple.db')
c = con.cursor()

dic = {
    'x1':{'y1':1.0,'y2':0.0},
    'x2':{'y1':0.0,'y2':2.0,'joe bla':1.5},
    'x3':{'y2':2.0,'y3 45 etc':1.5}
    }

# 1. Find the unique column names.
columns = set()
for _, cols in dic.items():
    for key, _ in cols.items():
       columns.add(key)

# 2. Create the schema.
col_defs = [
    # Start with the column for our key name
    '"row_name" VARCHAR(2) NOT NULL PRIMARY KEY'
    ]
for column in columns:
    col_defs.append('"%s" REAL NULL' % column)
schema = "CREATE TABLE simple (%s);" % ",".join(col_defs)
c.execute(schema)

# 3. Loop through each row
for row_name, cols in dic.items():

    # Compile the data we have for this row.
    col_names = cols.keys()
    col_values = [str(val) for val in cols.values()]

    # Insert it.
    sql = 'INSERT INTO simple ("row_name", "%s") VALUES ("%s", "%s");' % (
        '","'.join(col_names),
        row_name,
        '","'.join(col_values)
        )

Ответы [ 2 ]

6 голосов
/ 24 апреля 2010

Если я вас правильно понял, вы не пытаетесь вставить тысячи строк, а тысячи столбцов. SQLite имеет ограничение на количество столбцов в таблице (по умолчанию 2000), хотя это можно изменить, если перекомпилировать SQLite. Никогда не делая этого, я не знаю, нужно ли вам затем настраивать интерфейс Python, но я подозреваю, что нет.

Вы, вероятно, хотите переосмыслить свой дизайн. Любое приложение, не являющееся хранилищем данных / OLAP, вряд ли понадобится или будет ужасно эффективным с тысячами столбцов (строк, да), а SQLite не является хорошим решением для хранилища данных Тип ситуации OLAP. Вы можете продвинуться немного дальше с чем-то вроде установки значения атрибута сущности (не обычная рекомендация для подлинных реляционных баз данных, но действительная модель данных приложения и гораздо более вероятно, чтобы удовлетворить ваши потребности, не выходя за пределы SQLite слишком далеко).

0 голосов
/ 03 апреля 2012

Если вы действительно добавляете огромное количество строк и сталкиваетесь с проблемами, возможно, ваша отдельная транзакция становится слишком большой.

Выполните COMMIT (commit ()) после заданного количества строк (или даже после каждой вставки в качестве теста), если это приемлемо.

Тысячи строк должны быть легко осуществимы с помощью sqlite. Достигнув миллионов и выше, в какой-то момент может возникнуть необходимость в большем. Конечно, зависит от многих вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...