IntegrityError:数据类型不匹配

时间:2019-07-10 14:39:24

标签: python sqlite

我知道在here之前曾问过这个问题。原因是SQL模式与插入的数据不匹配。

因此,我确保SQL模式与插入的数据匹配。但是我收到一个IntegrityError错误。 您能告诉我数据类型不匹配在哪里吗?

   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!!!

1 个答案:

答案 0 :(得分:1)

任何类型的数据都可以存储在任何类型的列中,但有一个例外,例外情况是专门定义为INTEGER PRIMARY KEY(带有或不带有AUTOINCREMENT)的列是的别名。 rowid 列,必须为整数。如果它不是整数,则当您遇到数据类型不匹配错误时。

因此,原因是插入的第一个值不是整数。

通常INTEGER PRIMARY KEY用于自身生成的唯一标识符,不提供该值,而用作唯一标识行的手段。在这种用法中,不提供值(或可以使用null),SQLite会生成一个值(第一个为1,然后为2,然后为3,依此类推)。

目前尚不清楚实际的最佳解决方案,只是说您可能需要不同地定义 [ChannelStatusResult] ,以使其不是INTEGER PRIMARY KEY,因此该列不是别名。 rowid列的内容。

如果您使用

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

由于未对INTEGER PRIMARY KEY进行编码,因此 [ChannelStatusResult] 列不是 rowid 的别名,因此可以是任何值。然后 rowid 列将被隐藏,但仍然可以使用,例如您可以使用SELECT *,rowid FROM any_table

  • 但是,不用别名,可以通过VACUUM来更改rowid,因此不能依靠它来保持不变(因此,不应将其用于关系(建立关系的常用且有效的方法)在表格之间))。

  • 请注意,尽管INT PRIMARY KEY可以解决此问题,但这可能不是最佳解决方案。