IntegrityError:数据类型不匹配

2024-06-26 14:37:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道这个问题是在here之前提过的。原因是SQL架构和插入的数据不匹配。你知道吗

因此,我确保SQL模式与插入的数据匹配。但我得到了一个整数错误。 你能告诉我,数据类型不匹配可能在哪里吗?你知道吗

   conn = sqlite3.connect("contdata_sql.db")
   c = conn.cursor() # ich brauche ein Curser Object

   c.execute('''CREATE TABLE imbalanced ([ChannelStatusResult] INTEGER PRIMARY KEY,
      [Channels] text,
      [Channel] text,
      [Channel_Type] text,
      [Channel_Name] text)''')

     np.array(map(str, array_2d_sql))# make sure all values are strings
     print("array_2d_sql = ",array_2d_sql) 
     # = ['ChannelStatusResult' 'Channels' 'Channel' 'ChannelName'
     #'REST_RECEIVER_LOOKUP']
     # ['ChannelStatusResult' 'Channels' 'Channel' 'ChannelID'
     # '87842bb134ba31cf9c43685fabcd2eac']
      ...
     print("array_2d_sql.shape = ",array_2d_sql.shape) # = (461, 5)

      c.executemany('''INSERT INTO imbalanced VALUES (?,?,?,?,?)''',  array_2d_sql) # Error occures here!!!

Tags: 数据textsqlherechannel原因connarray
1条回答
网友
1楼 · 发布于 2024-06-26 14:37:08

任何类型的数据都可以存储在任何类型的列中,但有一个例外,即专门定义为INTEGER主键(带或不带AUTOINCREMENT)的列是rowid列的别名,必须是整数。如果它不是一个整数,那么就是当您得到数据类型不匹配错误时。你知道吗

因此,原因是insert的第一个值不是整数。你知道吗

通常INTEGER PRIMARY KEY用于自生成的唯一标识符,不提供该值,而是用作唯一标识行的方法。在这种用法中,不提供值(也可以使用null),SQLite生成一个值(第一个值为1,然后可能是2,然后是3,依此类推)。你知道吗

实际的最佳解决方案还不清楚,只是说您可能需要以不同的方式定义[ChannelStatusResult],以便它不是整数主键,因此该列不是rowid列的别名。你知道吗

如果你用过

c.execute('''CREATE TABLE imbalanced ([ChannelStatusResult] INT PRIMARY KEY,
      [Channels] text,
      [Channel] text,
      [Channel_Type] text,
      [Channel_Name] text)''')

由于未对整数主键进行编码,因此[ChannelStatusResult]列不是行id的别名,因此可以是任何值。rowid列被隐藏,但仍然可用,例如,您可以使用SELECT *,rowid FROM any_table。你知道吗

  • 但是,在没有别名的情况下,rowid可以由VACUUM更改,因此不能依赖于它而不更改(因此不应用于关系(在表之间建立关系的一种常见而有效的方法))。

  • 注意:尽管INT主键可以解决这个问题,但这可能不是最佳解决方案。

相关问题 更多 >