pyODBC на Python: проблема с вставкой в таблицу sql server со столбцом идентификаторов

#sql #sql-server #python-3.x #pyodbc

#sql #sql-server #python-3.x #pyodbc

Вопрос:

Инструкция INSERT, созданная с помощью Python, выдает ошибку при ее выполнении и фиксации. Я взял копию инструкции из Python и запустил ее сам в SQL SERVER, и там она отлично работает. Таблица, в которую я пытаюсь вставить, имеет столбец идентификатора. Когда Python попытается выполнить, это выдаст мне сообщение об ошибке, приведенное ниже, когда я исключаю столбец identity в инструкции

Таблица выглядит следующим образом MY_TABLE (идентификатор INT IDENTITY (1,1) НЕ равен НУЛЮ, A INT, B INT)

 INSERT INTO MY_TABLE (A, B) VALUES(VALUE_A, VALUE_B);
  

«(‘23000’, «[23000] [ Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Не может вставить значение NULL в столбец ‘MY_IDENTITY_COLUMN’, таблица ‘MY_TABLE’; столбец не допускает нулевых значений. ОШИБКА ВСТАВКИ. (515) (SQLExecDirectW); [23000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Инструкция была завершена. (3621)»)»

Но когда я пытаюсь включить значение для столбца идентификатора (я не хочу этого делать) Я получаю следующую ошибку, которая имеет смысл, поскольку это столбец идентификатора, который мы разрешаем автоматически увеличивать в таблице

«Не удается вставить явное значение для столбца идентификатора в таблице ‘MY_TABLE’, когда для IDENTITY_INSERT установлено значение OFF».

Когда я запускаю запрос в SQL SERVER, таблица заполняет значение для самого столбца Identity и автоматически увеличивается, но по какой-то причине, когда я запускаю инструкцию в Python, она этого не делает и пытается передать NULL

Версия SQL SERVER: 10.50.6560.0

Комментарии:

1. Вы пытаетесь вставить значение в IDENTITY столбец, чего не следует делать, если вы не установили IDENTITY_INSERT OFF .

2. правильно, но, как я уже говорил выше, когда я не передаю значения для этого столбца, я получаю первую ошибку также, когда я не указываю значения, я имею в виду, как это ВСТАВИТЬ В MY_TABLE (IDENTITY_COLUMN, A, B, ) ЗНАЧЕНИЯ (VALUE_A, VALUE_B)

3. Исключите столбец, таким образом, все будет работать просто отлично.

4. Первая ошибка возникает, когда я исключаю столбец

5. @Ilyes это должно быть принятым решением. В противном случае вам нужно было бы добавить оператор identity off в верхней части sql и снова включить его в конце блоков инструкций.

Ответ №1:

Признавая, что это немного поздно, но… Недавно у меня была такая же проблема с использованием какой-то старой программы и ODBC. Решение состояло в том, чтобы создать представление в SQL Server только с требуемыми столбцами (т. Е. A и B в вашем случае), а затем вставить в это представление.

Ответ №2:

Немного сложно сказать без вашего кода, но вот пример.

В базе данных создайте тестовую таблицу

 CREATE TABLE dbo.test(  
ID INT IDENTITY NOT NULL PRIMARY KEY,   
Name VARCHAR(40) NOT NULL  
);  
  

Затем в Python укажите столбцы, в которые вы вставляете

 import pyodbc

warecn = pyodbc.connect("Your Connection Stuff")

Inscursor = warecn.cursor()

Inscursor.execute("Insert into dbo.test(name) values ('This'), ('is'), ('a'), ('test')")


Inscursor.commit()
Inscursor.close()
del Inscursor
warecn.close()
  

Комментарии:

1. Это то, что я делаю, но Python, похоже, пытается передать NULL для столбца ID, хотя, как и в вашем операторе insert, я не пытаюсь вставить в этот столбец

2. Используете ли вы INSERT INTO MY_TABLE (A, B) ЗНАЧЕНИЯ (VALUE_A, VALUE_B);? Без указанного IDENTITY_COLUMN?

3. Хххмм. Не могли бы вы отредактировать свой вопрос, чтобы включить код, который передает значения в VALUE_A и VALUE_B?

4. Извините, я имел в виду цикл или функцию в вашем коде python, которая передает значения для VALUE_A и VALUE_B. Если вы закомментируете инструкцию insert и используете print(‘значение A равно {}, а значение B равно {}’.format(VALUE_A,VALUE_B)) Что печатается?

5. о, извините, не понял вопроса, поэтому я сделал это и запустил результат в SQL SERVER, и он работает без проблем, но при выполнении python выдает первую ошибку