Python int过大无法转换为SQLite INTEGER报错如何解决?
问题原因
SQLite 原生支持的 INTEGER 类型为64位有符号整数,取值范围仅覆盖 -9223372036854775808 到 9223372036854775807,而Python支持任意精度的大整数,当你存入的int值超出上述范围时,就会触发Python int too large to convert to SQLite INTEGER报错,你提到的阈值9126776637782808953已经非常接近64位有符号整数的上限。
修复方案
方案1:修改表结构使用
TEXT类型存储大整数
建表时将对应字段的类型从INTEGER改为TEXT,写入时直接把大整数转成字符串存入,读取后再转回int类型即可,适用于不需要在SQL层对该字段做数值比较、运算的场景。
示例代码:# 写入时转换 large_int = 9126776637782808954 cursor.execute("INSERT INTO table_name (large_num_field) VALUES (?)", (str(large_int),)) # 读取后转换 cursor.execute("SELECT large_num_field FROM table_name WHERE id = ?", (target_id,)) res = int(cursor.fetchone()[0])方案2:自定义SQLite适配/转换器
可以给Python的sqlite3模块注册大整数的适配和转换规则,自动完成字符串和大整数的双向转换,无需手动处理每个读写逻辑:import sqlite3 # 注册适配器:Python int转SQLite存储的字符串 def adapt_large_int(val): return str(val) # 注册转换器:SQLite读取的字符串转回Python int def convert_large_int(val): return int(val) sqlite3.register_adapter(int, adapt_large_int) sqlite3.register_converter("LARGEINT", convert_large_int) # 连接数据库时开启类型检测 conn = sqlite3.connect("test.db", detect_types=sqlite3.PARSE_DECLTYPES) cursor = conn.cursor() # 建表时指定字段类型为LARGEINT cursor.execute("CREATE TABLE IF NOT EXISTS test_table (id INTEGER PRIMARY KEY, num LARGEINT)") # 直接写入大整数即可,无需手动转换 large_num = 9126776637782808954 cursor.execute("INSERT INTO test_table (num) VALUES (?)", (large_num,)) conn.commit()方案3:使用
BLOB类型存储
也可以将大整数序列化后以二进制BLOB形式存入,适合需要加密存储或者对存储空间有要求的场景,读写时需要做序列化和反序列化处理。方案4:使用
REAL类型存储(仅适合低精度要求场景)
如果对精度要求不高,可以将字段改为REAL浮点类型存储,但超过2^53的整数会有精度丢失风险,仅适用于数值粗略统计的场景。
内容的提问来源于stack exchange,提问作者주식마스터
相关产品推荐
相关产品推荐

