我的数据库在特定的时间内每秒都被写入,也在相同的时间内每分钟都被读取。
在操作时间和非操作时间读取输出不同的值。可能是读取时数据未写入。如何修复此问题或确保阅读前最后一分钟的数据完整?不同的数据库是否会做得更好?
我的阅读方式:
conn = sqlite3.connect(f'{loc_tick}/tick.db',
detect_types=sqlite3.PARSE_DECLTYPES, timeout=20, isolation_level=None)
select_statement = f"select * from symfut WHERE
timestamp >= date('now', '-10 days')"
m1df = pd.read_sql(select_statement, conn)
写上:
conn = sqlite3.connect('tick.db',
detect_types=sqlite3.PARSE_DECLTYPES, timeout=20,isolation_level=None)
c = conn.cursor()
c.execute('PRAGMA journal_mode=wal')
c.execute('PRAGMA wal_autocheckpoint = 100')
c.execute('INSERT INTO symfut (timestamp, c, b, a) VALUES (?,?,?,?)',
(timestamp, c, b, a))
1条答案
按热度按时间wlwcrazw1#
虽然SQLite不支持完全并发,但这并不意味着它不能正确地满足您的需求。使用Postgress或不同的数据库实际上会使问题恶化。
Sqlite是高度可靠的,其行为是绝对确定的,如果所有进程都在同一台机器上,并且db文件不在网络上,它完全能够处理一个写入器和多个读取器的情况。
当写入事务结束时,即使在WAL模式下,也保证每次后续读取都能读取更新的值。
您的问题可能与此相关:
1.当你在阅读的时候,写事务仍然是打开的并且没有完成。2如果读和写是不同步的独立进程,就可能发生这种情况。3使用不同的数据库不能解决这个问题,你必须提供一个同步机制。
1.当你写的时候,你提供了一个时间戳。它是如何计算的?它是在UTC时区吗?从你计算时间戳到你写时间戳之间经过了多少时间?注意,INSERT在执行之前可能必须等待你的超时。
1.当您阅读时,您使用'now - 10 days',它是以UTC时区计算的,并在执行SELECT时解析,没有任何延迟。将它与时间戳INSERTED结合使用,这可能会在操作时间和非操作时间之间产生一些差异。
1.如果您每秒插入一行,SELECT语句将返回数十万行,并且可能需要几秒钟的时间来执行。由于Sqlite保证了一致性,因此不会考虑在执行select语句时插入的行。这可能是在插入行时执行select语句与在下班时间执行select语句的另一个区别。