2016-06-22 4 views
0

Я вставляю данные из некоторых файлов csv в базу данных SQLite3 с написанным мной скриптом python. Когда я запускаю сценарий, он вставляет первую строку в базу данных, но дает эту ошибку при попытке вставке второй:Столбцы SQLite3 не уникальны

sqlite3.IntegrityError: columns column_name1, column_name2 are not unique. 

Действительно значения в column_name1 и column_name2 одинаковы в первых двух строках файл csv. Но это кажется мне немного странным, потому что чтение об этой ошибке указывает на то, что это означает ограничение уникальности для одного или нескольких столбцов базы данных. Я проверил данные базы данных с помощью SQLite Expert Personal и не обнаружил ограничений уникальности для текущей таблицы. Кроме того, ни одно из полей, которые я вводил, не указывает первичный ключ. Кажется, что база данных автоматически назначает их. Любые мысли о том, что может вызвать эту ошибку? Благодарю.

import sqlite3 
import csv 

if __name__ == '__main__' : 

conn = sqlite3.connect('ts_database.sqlite3') 
c = conn.cursor() 

fileName = "file_name.csv" 
f = open(fileName) 
csv_f = csv.reader(f) 

for row in csv_f: 
    command = "INSERT INTO table_name(column_name1, column_name2, column_name3)" 
    command += " VALUES (%s, '%s', %s);" % (row[0],row[1],row[2]) 
    print command 
    c.execute(command) 
    conn.commit() 

f.close() 
+0

Зачем этот пост проголосовали? Я думаю, что он показал адекватную исследовательскую базу и дал четкое объяснение этой проблемы. Я, конечно, не просто копировал и вставлял свой код и спрашивал: «Что случилось с этим?» –

ответ

2

Если SQLite сообщает об ошибке IntegrityError, очень вероятно, что на этих двух столбцах действительно есть PRIMARY KEY или UNIQUE KEY, и вы ошибаетесь, когда утверждаете, что нет. Убедитесь, что вы действительно смотрите один и тот же экземпляр базы данных.

Кроме того, do не написать инструкцию SQL с использованием строковой интерполяции. Это опасно, и также сложно получить правильное (как вы, вероятно, знаете, учитывая, что у вас есть одинарные кавычки на одном из полей). Использование параметризованных операторов в SQLite очень, очень просто.

+0

Спасибо. Я не знаком с графическим интерфейсом SQLite, который я использую. Я пришел к неверному выводу об этом. –

0

Ошибка может возникать из-за дублирования имен столбцов в инструкции INSERT INTO. Я предполагаю, что это опечатка, и вы указали column_name3 в инструкции INSERT INTO.

+0

Да. Фактически, я просто заменил имена настоящих колонок этими причинами по соображениям конфиденциальности. На самом деле эти ярлыки уникальны. –

+0

Я изменил его, чтобы избавиться от какой-либо двусмысленности. –

Смежные вопросы