pyodbc insert into sql

前端 未结 2 942
你的背包
你的背包 2020-12-05 03:52

I use a MS SQL express db. I can connect and fetch data. But inserting data does not work:

cursor.execute(\"insert into [mydb].[dbo].[ConvertToolLog] ([Messa         


        
相关标签:
2条回答
  • 2020-12-05 04:40

    Same issue here, slight modification to answers above. I struggled with this for a while, realized the SQL was running but not committing. My environment is Python 3.8.2, MSSQL Server Express 15.0.2070.41 (2019). I had to use cursor.commit(), and it worked as expected.

    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()
    
    0 讨论(0)
  • 2020-12-05 04:42

    You need to commit the data. Each SQL command is in a transaction and the transaction must be committed to write the transaction to the SQL Server so that it can be read by other SQL commands.

    Under MS SQL Server Management Studio the default is to allow auto-commit which means each SQL command immediately works and you cannot rollback.

    The example is from pyodbc Getting Started document

    First opening the database and set up a cursor

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

    The insert example in the document is then

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

    or better using parameters

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

    As the document says

    Note the calls to cnxn.commit(). You must call commit or your changes will be lost! When the connection is closed, any pending changes will be rolled back. This makes error recovery very easy, but you must remember to call commit.

    0 讨论(0)
提交回复
热议问题