[英]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.