You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)的限制,无法存储超出范围的主键值。

疑问

  1. 这种自动移除单下划线的行为是否是Peewee的预期设计?
  2. 下划线在PrimaryKeyField中是否被当作特殊分隔符?
  3. 为何该问题仅出现在PrimaryKeyField而非TextField?按逻辑,PrimaryKeyField只需保证值唯一,不应干预存储内容。

内容的提问来源于stack exchange,提问作者mrmrmr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 03:07:28