sqlite3 неизвестная схема базы данных при использовании контрольной точки? - PullRequest
1 голос
/ 01 ноября 2019

Я получаю:

sqlite3.OperationalError: неизвестная схема базы данных

conn = sqlite3.connect('tick.db', detect_types=sqlite3.PARSE_DECLTYPES, timeout=20,isolation_level=None)
# conn1 = sqlite3.connect('nifty_tick.db', detect_types=sqlite3.PARSE_DECLTYPES, timeout=20,isolation_level=None)

c = conn.cursor()
# c1 = conn1.cursor()

c.execute('PRAGMA journal_mode=wal')

def tick_entry1(inst,timestamp,ltp, bid, ask):
    if inst == 12335874:
        c.execute('INSERT INTO niftyfut (timestamp, close, bid, ask) VALUES (?,?,?,?)',
                  (timestamp, ltp, bid, ask))

def on_ticks(ws, ticks):
    global c, conn
    for t in ticks:
        if t['instrument_token'] == 12335874:
            timestamp = t['timestamp']
            ltp = t['last_price']
            inst = t['instrument_token']

            try:
                tick_entry1(inst,timestamp,ltp)
            except:
                # print('problem with db')
                pass
    c.execute('PRAGMA schema.wal_checkpoint(FULL);')

Я пытался:

c.execute('PRAGMA schema.wal_checkpoint(FULL);')

и

c.execute('PRAGMA schema.wal_checkpoint(FULL)')

TIA

---- Редактировать ----

Я только что попробовал:

c.execute('PRAGMA wal_checkpoint(FULL)')

Кажется, работает. Теперь задаюсь вопросом, должно ли быть выполнено следующее в начале .:

c.execute("PRAGMA wal_autocheckpoint = 0")

1 Ответ

1 голос
/ 01 ноября 2019

В сообщении говорится, что ни в одной базе данных нет схемы с именем schema.

В документации схема выделена курсивом, что указывает на то, что оно является символическим, а не фактическим значением и будет заменено на соответствующее значение; это значение используется для различения подключенных баз данных.

например, если вы использовали

ATTACH DATABASE the_database_path AS database2 /*<<<<<<<<<< THE SCHEMA is database2 */; 

, то вы могли бы использовать

PRAGMA database2.wal_checkpoint(FULL); 

для проверки присоединенной базы данных.

Исходная схема базы данных: main , но не является обязательным, поскольку используется по умолчанию, если схема не указана.

Следовательно, почему c.execute('PRAGMA wal_checkpoint(FULL)') работал (как c.execute('PRAGMA main.wal_checkpoint(FULL)')). т. е. фактически одинаковы.

Если вы используете c.execute("PRAGMA wal_autocheckpoint = 0"), вам придется управлять всеми контрольными точками, так как автоматическая контрольная точка будет отключена (обратите внимание, что закрываются все контрольные точки соединений с базой данных).

Вы можете рассмотреть следующие вопросы: -

Отключение механизма автоматической проверки. В конфигурации по умолчанию SQLite будет проверять файл WAL при завершении любой транзакции, если длина файла WAL превышает 1000 страниц. Однако существуют параметры времени компиляции и времени выполнения, которые могут отключить или отложить эту автоматическую контрольную точку. Если приложение отключает автоматическую контрольную точку, ничто не мешает чрезмерному росту файла WAL. Запись в режиме записи - 6. Избегание чрезмерно больших файлов WAL

Я бы посоветовал не использовать PRAGMA wal_autocheckpoint = 0 autocheckpointing не препятствует принудительной контрольной точке, кроме случаев, когда принудительная контрольная точка возникает после автоматической контрольной точки (и всестраницы записаны) и ничего не было обновлено, тогда это ничего не изменит (изящно), иначе в файл базы данных будет записано больше страниц.

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