Python pyODBC: проблема вставки в таблицу SQL Server со столбцом идентификаторов - PullRequest
1 голос
/ 04 апреля 2019

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

Таблица выглядит следующим образом MY_TABLE (ID INT IDENTITY (1,1) NOT NULL, 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'; столбец не допускает пустые значения. Ошибка INSERT . (515) (SQLExecDirectW); [23000] [Microsoft] [Драйвер ODBC SQL Server] [SQL Server] Оператор завершен. (3621) ")"

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

"Невозможно вставить явное значение для столбца идентификаторов в таблице 'MY_TABLE', когда для IDENTITY_INSERT установлено значение OFF."

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

Версия SQL SERVER: 10.50.6560.0

1 Ответ

0 голосов
/ 04 апреля 2019

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

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

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()
...