IntegrityError: несоответствие типа данных - PullRequest
0 голосов
/ 10 июля 2019

Я знаю, что этот вопрос задавался раньше здесь . Причиной было несоответствие между схемой 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 Ответ

1 голос
/ 10 июля 2019

Любой тип данных может храниться в любом типе столбца, за одним исключением, за исключением того, что столбец, определенный как 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.

  • Однако, не будучи псевдонимом, rowid может быть изменен с помощью VACUUM , и поэтому нельзя полагаться на то, что он не изменяется (и, следовательно, не должен использоваться для отношений (общий и эффективный способ построение связей между таблицами)).

  • Обратите внимание, что, хотя INT PRIMARY KEY может решить проблему, это может быть не лучшим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...