我知道在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!!!
答案 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可以解决此问题,但这可能不是最佳解决方案。