【问题标题】:Python pyODBC : Issue inserting into a sql server table with an identity columnPython pyODBC:插入带有标识列的 sql server 表时出现问题
【发布时间】:2019-08-26 10:03:52
【问题描述】:

使用 Python 创建的 INSERT 语句在我执行和提交时给我一个错误。我从 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 Driver][SQL Server]无法将值 NULL 插入列 'MY_IDENTITY_COLUMN',表 'MY_TABLE';列不允许空值。插入失败. (515) (SQLExecDirectW); [23000] [Microsoft][ODBC SQL Server Driver][SQL Server]语句已终止。(3621)")"

但是当我尝试包含 Identity 列的值时(我不想这样做),我收到以下错误,这是有道理的,因为它是我们让表自动递增的标识列

“当 IDENTITY_INSERT 设置为 OFF 时,无法为表 'MY_TABLE' 中的标识列插入显式值。”

当我在 SQL SERVER 中运行查询时,表会填充标识列本身的值并自动递增,但由于某种原因,当我在 Python 中运行语句时,它不会这样做并尝试传递 NULL

SQL SERVER 版本:10.50.6560.0

【问题讨论】:

  • 您正在尝试向IDENTITY 列插入一个值,除非您设置IDENTITY_INSERT OFF,否则您不应该这样做。
  • 正确,但是就像我上面所说的,当我没有为该列传递任何值时,我也会收到第一个错误,当我声明没有值时,我的意思是这样 INSERT INTO MY_TABLE (IDENTITY_COLUMN, A, B, ) VALUES (VALUE_A,VALUE_B)
  • 排除列,这样每件事都会正常工作。
  • 第一个错误是当我排除列时

标签: sql sql-server python-3.x pyodbc


【解决方案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()
    

    【讨论】:

    • 这就是我正在做的,但 Python 似乎正在尝试为 ID 列传递一个 NULL,即使就像在您的插入语句中一样,我没有尝试插入该列
    • 您是否使用 INSERT INTO MY_TABLE (A, B) VALUES(VALUE_A, VALUE_B);?没有列出 IDENTITY_COLUMN?
    • 嗯。是否可以编辑您的问题以包含将值传递给 VALUE_A 和 VALUE_B 的代码?
    • 对不起,我的意思是你的 python 代码中的循环或函数,它传递了 VALUE_A 和 VALUE_B 的值。如果注释掉插入语句并使用 print('value A is {} and value B is {}'.format(VALUE_A,VALUE_B)) 会打印什么?
    • 哦,抱歉没理解问题,所以我这样做了,并在 SQL SERVER 中运行了结果,它没有问题,但是当 python 执行时,它给出了第一个错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多