Python IntegrityError:数据类型不匹配

Python IntegrityError:数据类型不匹配,python,sqlite,Python,Sqlite,我知道以前有人问过这个问题。原因是SQL架构和插入的数据不匹配 因此,我确保SQL模式与插入的数据匹配。但我得到了一个整数错误。 您能告诉我,数据类型不匹配可能在哪里吗 conn = sqlite3.connect("contdata_sql.db") c = conn.cursor() # ich brauche ein Curser Object c.execute('''CREATE TABLE imbalanced ([ChannelStatusResult] INT

我知道以前有人问过这个问题。原因是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!!!

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

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

通常,整数主键用于自生成的唯一标识符,不提供该值,而是用作唯一标识行的方法。在这种用法中,不提供值,也可以使用null,SQLite首先生成值1,然后可能生成值2,然后生成值3,依此类推

实际的最佳解决方案尚不清楚,只是说您可能需要以不同的方式定义[ChannelStatusResult],这样它就不是INTEGER主键,因此该列不是rowid列的别名

如果你用

c.execute('''CREATE TABLE imbalanced ([ChannelStatusResult] INT PRIMARY KEY,
      [Channels] text,
      [Channel] text,
      [Channel_Type] text,
      [Channel_Name] text)''')
由于未对整型主键进行编码,[ChannelStatusResult]列不是rowid的别名,因此可以是任何值。rowid列随后被隐藏,但仍然可用,例如,您可以从任何_表中使用SELECT*、rowid

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

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


如果您的元素都是字符串,那么尝试将值插入到INTEGER主键列中可能会有问题。