我知道这个问题是在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!!!
任何类型的数据都可以存储在任何类型的列中,但有一个例外,即专门定义为INTEGER主键(带或不带AUTOINCREMENT)的列是rowid列的别名,必须是整数。如果它不是一个整数,那么就是当您得到数据类型不匹配错误时。你知道吗
因此,原因是insert的第一个值不是整数。你知道吗
通常
INTEGER PRIMARY KEY
用于自生成的唯一标识符,不提供该值,而是用作唯一标识行的方法。在这种用法中,不提供值(也可以使用null),SQLite生成一个值(第一个值为1,然后可能是2,然后是3,依此类推)。你知道吗实际的最佳解决方案还不清楚,只是说您可能需要以不同的方式定义[ChannelStatusResult],以便它不是整数主键,因此该列不是rowid列的别名。你知道吗
如果你用过
由于未对整数主键进行编码,因此[ChannelStatusResult]列不是行id的别名,因此可以是任何值。rowid列被隐藏,但仍然可用,例如,您可以使用
SELECT *,rowid FROM any_table
。你知道吗但是,在没有别名的情况下,rowid可以由VACUUM更改,因此不能依赖于它而不更改(因此不应用于关系(在表之间建立关系的一种常见而有效的方法))。
注意:尽管INT主键可以解决这个问题,但这可能不是最佳解决方案。
相关问题 更多 >
编程相关推荐