[英]sqlite3 unknown database schema when using a checkpoint?
我正進入(狀態:
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)')
我剛試過:
c.execute('PRAGMA wal_checkpoint(FULL)')
它似乎工作。 現在想知道是否應該在開始時執行以下操作:
c.execute("PRAGMA wal_autocheckpoint = 0")
該消息是說沒有數據庫具有名為 schema 的模式。
在文檔中,模式是斜體的,表示它是符號而不是實際值,並且將被替換為適當的值,該值用於區分附加的數據庫。
例如,如果您使用
ATTACH DATABASE the_database_path AS database2 /*<<<<<<<<<< THE SCHEMA is database2 */;
那么你可以使用
PRAGMA database2.wal_checkpoint(FULL);
檢查附加的數據庫。
初始數據庫的模式是主要的,但不是必需的,因為如果沒有提供模式,它是默認值。
因此,為什么c.execute('PRAGMA wal_checkpoint(FULL)')
有效(就像c.execute('PRAGMA main.wal_checkpoint(FULL)')
)。 即實際上是相同的。
如果您使用c.execute("PRAGMA wal_autocheckpoint = 0")
那么您將必須管理所有檢查點,因為自動檢查點將被關閉(注意關閉所有數據庫連接檢查點)。
您不妨考慮:-
禁用自動檢查點機制。 在其默認配置中,當 WAL 文件超過 1000 頁時,SQLite 將在任何事務結束時檢查 WAL 文件。 但是,存在可以禁用或延遲此自動檢查點的編譯時和運行時選項。 如果應用程序禁用了自動檢查點,則沒有什么可以阻止 WAL 文件過度增長。 預寫式日志記錄 - 6. 避免過大的 WAL 文件
我建議不要使用PRAGMA wal_autocheckpoint = 0
自動檢查點不會妨礙強制檢查點,除非強制檢查點發生在自動檢查點之后(並且所有頁面都被寫入)並且沒有任何更新,那么它將什么都不做(優雅地),否則更多頁面將寫入數據庫文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.