Peewee SQLite中PrimaryKeyField自动移除单下划线转整数问题咨询
Peewee PrimaryKeyField 自动移除单下划线的异常问题
from peewee import * db = SqliteDatabase('itemstocheck.sqlite') class PriceCheck(Model): pricecheck_id = PrimaryKeyField() item_number = TextField() price = DecimalField() bids_qty = IntegerField() datetime_checked = TextField() class Meta: database = db db_table = "pricechecks" def main(): print("***** Let's create a price check entry in the DB *****") PriceCheck.create( pricecheck_id = "47_3_1", # 下划线被自动移除,字符串被当作整数处理;如果前缀加非数字字符,会被视为字符串 item_number = "123456789", price="70.91", bids_qty="4", datetime_checked="987654321" ) if __name__ == "__main__": main()
问题现象
当用PrimaryKeyField定义主键字段时,插入"47_3_1"这类含单下划线的字符串值,Peewee会自动移除下划线,将其转为整数4731存入数据库。但存在例外场景:
- 字符串含连续下划线(如
"47_3__1"或"47__3_1")时,下划线不会被移除,会完整保留为字符串 - 首尾带下划线的字符串也会被正常识别为字符串类型
补充测试验证
- 输入
"772_1.2"时,下划线被移除但小数点保留,说明字段被当作十进制数处理 - 输入
"077_1"或"077_1.2"时,前导零会被去除且下划线被移除 - 输入
"077__1"(含连续下划线)时,前导零不会被移除,完整保留原始字符串内容
该问题仅针对PrimaryKeyField存在:若将字段改为TextField,即使数字间有单个下划线,也不会被移除,能正常存储原始字符串。
当前临时解决方案
目前只能通过以下补丁式方法规避问题:
- 依赖SQLite按 schema 存储值
- 在数值前添加非数字前缀(如
"a_47_3_1") - 刻意用双下划线替代单下划线
但这些方法无法从根本解决问题,还面临64位有符号整数上限(9223372036854775807)的限制,无法存储超出范围的主键值。
疑问
- 这种自动移除单下划线的行为是否是Peewee的预期设计?
- 下划线在
PrimaryKeyField中是否被当作特殊分隔符? - 为何该问题仅出现在
PrimaryKeyField而非TextField?按逻辑,PrimaryKeyField只需保证值唯一,不应干预存储内容。
内容的提问来源于stack exchange,提问作者mrmrmr
相关产品推荐
相关产品推荐

