python sqlite3 несколько баз данных - PullRequest
0 голосов
/ 23 мая 2019

У меня одни и те же данные, распределенные по многим идентичным базам данных. Я хочу объединить все эти данные в одну базу данных (более миллиона записей)

У меня есть объекты подключения и объекты курсора из базы данных-донора и базы данных-получателя, и я тщательно отслеживаю их. Затем я делаю [SELECT *…] из базы данных и В fetchall, пытаясь вставить в архив. Кажется, это работает, но никогда не будет принимать переменные: [.... VALUES (557)] будет приятно добавлять 557. Но [… .VALUES (?) »(Var_name))] никогда не работает.

import sqlite3

conn = sqlite3.connect ('small_no_sort_2')
c = conn.cursor()
conn_rec = sqlite3.connect ('may_22_2019_int_db')  # new database,,,table is first_table
c_rec = conn_rec.cursor()

def data_entry_col_three():
    c_rec.execute ("INSERT INTO first_table (column_five) VALUES   (?)", (var))
    conn_rec.commit()

c.execute ("SELECT column_five FROM first_table WHERE column_five > 1809200 and column_five < 1822000 ")
all_rows = c.fetchmany(15)
for row in all_rows:
    if (row[0]) > 1819700 and row[0]< 1822799:
        print (row[0])
        var = row[0]
        var = str(var)
        var = (var[0:7])
        var = int(var)
        print (type(var))
        print (".....")
        print (var)
        new_var = 2000
        data_entry_col_three()

Заметьте, что я довольно долго суетился с типами данных. [data_entry_col_three] эта функция будет принимать число, но не переменную. ………………. ЗНАЧЕНИЯ (33445) будут работать, но не ………………… ЗНАЧЕНИЯ (?), »(Var)).

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Проще и эффективнее делать все это в SQL.

После того, как вы откроете базу данных назначения, что-то вроде

ATTACH DATABASE 'source.db' AS source;
INSERT INTO main.first_table(column_five)
  SELECT column_five
  FROM source.first_table
  WHERE column_five BETWEEN 1819701 AND 1822798;
DETACH source;

будет вставлять значения из исходной таблицы взаданный диапазон в таблицу назначения.

0 голосов
/ 23 мая 2019

Ваш код содержит 2 проблемы.

Во-первых, execute ожидает последовательность в качестве второго параметра. Здесь вы передаете (var), который не является кортежем в соответствии с внутренним синтаксическим анализом Python, а просто заключает в скобки значение, поэтому вы выполняете c_rec.execute ("INSERT INTO first_table (column_five) VALUES (?)", var)

Вы должны изменить его, чтобы значение отображалось как кортеж с запятой:

c_rec.execute ("INSERT INTO first_table (column_five) VALUES   (?)", (var,))

Далее вы обрабатываете только 15 строк (из-за all_rows = c.fetchmany(15)). Вполне вероятно, что ни один из них не соответствует следующему if (row[0]) > 1819700 and row[0]< 1822799:, и этот код просто ничего не делает. Немедленное исправление здесь:

all_rows = c.fetchall()

После этих 2 исправлений вторая база данных должна иметь некоторые значения ...


При этом, если все, что вы хотите сделать, это скопировать значение из одной базы данных в другую без какой-либо дополнительной обработки, решение от Шона, безусловно, будет проще поддерживать ...

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