【问题标题】:pyodbc insert into sqlpyodbc 插入 sql
【发布时间】:2019-09-02 05:19:06
【问题描述】:

我使用 MS SQL express 数据库。我可以连接并获取数据。但是插入数据不起作用:

cursor.execute("insert into [mydb].[dbo].[ConvertToolLog] ([Message]) values('test')")

我没有收到任何错误,但表中没有插入任何内容。 在我获取数据后立即获取插入的行。但是什么都没有保存。

在 MS SQL Server Management Studio 中,插入确实有效。

【问题讨论】:

    标签: python sql sql-server-express python-2.6 pyodbc


    【解决方案1】:

    您需要提交数据。每个 SQL 命令都在一个事务中,必须提交事务才能将事务写入 SQL Server,以便其他 SQL 命令可以读取。

    在 MS SQL Server Management Studio 下,默认设置是允许自动提交,这意味着每个 SQL 命令都会立即生效,并且您无法回滚。

    例子来自pyodbc Getting Started document

    首先打开数据库并设置游标

    import pyodbc
    
    # Specifying the ODBC driver, server name, database, etc. directly
    cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass')
    
    # Create a cursor from the connection
    cursor = cnxn.cursor()
    

    然后在文档中插入示例

    # Do the insert
    cursor.execute("insert into products(id, name) values ('pyodbc', 'awesome library')")
    #commit the transaction
    cnxn.commit()
    

    或更好地使用参数

    cursor.execute("insert into products(id, name) values (?, ?)", 'pyodbc', 'awesome library')
    cnxn.commit()
    

    如文件所述

    注意对 cnxn.commit() 的调用。 您必须调用 commit 否则您的更改将会丢失! 当连接关闭时,所有未决的更改都将被回滚。这使得错误恢复非常容易,但你必须记得调用 commit。

    【讨论】:

    • 在我的情况下,cnxn(AKA 连接)cnxn.commit() 不起作用,但我使用像 cursor.commit() 这样的精确光标
    【解决方案2】:

    这里有同样的问题,对上面的答案稍作修改。我为此挣扎了一段时间,意识到 SQL 正在运行但没有提交。我的环境是 Python 3.8.2,MSSQL Server Express 15.0.2070.41(2019)。我不得不使用 cursor.commit(),它按预期工作。

    import pyodbc
    
    # cnxn info is in a text file so I can change it in one place
    def cnxn():
        f=open("sql_conn.csv")
        sql_split=f.read().split(",")
        server=sql_split[0]
        database=sql_split[1]
        uid=sql_split[2]
        pwd=sql_split[3]
        return pyodbc.connect('DRIVER={ODBC Driver 17 for SQL 
        Server};SERVER=%s;DATABASE=%s;UID=%s;PWD=%s' % (server,database,uid,pwd))
    
    
    # sql statement is passed by .py script
    def f_sql_insert(sql):
        cursor = cnxn().cursor()
        cursor.execute(sql)
        cursor.commit()
        cnxn().close()
    

    【讨论】:

      猜你喜欢
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多