python执行sql server的insert 、update、delete未commit的坑

本文探讨了Python使用pymssql和sqlalchemy模块操作SQLServer时遇到的事务提交问题。在标准SQL中,DML语句通常自动提交,但在Python环境下需要手动提交。pymssql和sqlalchemy都需要显式调用commit()才能确保事务生效。同时,pyspark与SQLServer交互时则默认自动提交。示例代码展示了如何在python中正确处理这个问题。
摘要由CSDN通过智能技术生成

1. 问题场景

  由于平时博主都是python操作mysql比较多,python处理sql server极为少见,但最近发现python在操作sql server的insert 、update、delete、truncate table等改变表数据内容的DML语句时,必须手动提交;这里以import pymssqlfrom sqlalchemy import create_engine.两个操作sql server的python包为例;

  感觉这两个作者要么就是深受标准SQL的影响,要知道sql server的sql语法可是出了名的不正经、人性化!在他官方自带的客户端工具SSMS内:

  • select 1+1,正常运行,不需要from
  • 两句sql之间不需要;能运行;
  • 自动commit
  • ……

  现在在python内改成默认手动提交,确实坑,而且最重要的是你如果不配置手动提交的语句或参数,他不错,也不报警告,让你觉得你的语句是对的,但是就是不起作用,让你怀疑人生;

2. import pymssql代码案例

  必须要有db.commit();

import pymssql

#call_mssql_refresh_sp文件

# 自定义SP的函数
def call_refresh_stage_id_sp(server, user, password, database, sql):
    #connect to mssql db
    try :
      db =pymssql.connect(server,user,password,database) #连接到sql server数据库
      cur = db.cursor() #获取该数据库连接下的环境变量
      cur.execute(sql) #执行语句
    except Exception as e:
      print(e)
      raise e
    else :
      result = cur.fetchall()  #get result
      for i in result:
        print("新增数量和返回值:")
        print(i)  #list result

    finally :
      try :
        db.commit()  
        #一定要commit,pymssql包默认是需要手动commit的,否则事务不生效,此处坑死我了,因为python一直不生效,打印出来的语句在ssms上跑怎么跑怎么生效
        db.close() #关闭数据库连接
      except : pass

3. from sqlalchemy import create_engine代码案列

  一定要有isolation_level="AUTOCOMMIT"
完整代码参考Hadoop集群数据分发——pyspark导出Hive集群数据及python写入mysql或sql server;

from sqlalchemy import create_engine

 conn_str="mssql+pymssql://%s:%s@%s/%s?charset=utf8"%(user_name,password,url[17:url.index(";")],url[url.index("DatabaseName")+13:])
 db_engine=create_engine(conn_str,isolation_level="AUTOCOMMIT",echo=False,encoding="utf-8")
db_engine.execute(sql_item)
        

4.pyspark 操作sql server默认就是自动提交

  操作pyspark 操作sql server默认就是自动提交,这哥们就很上道,很sql server;代码如下;完整代码参考Hadoop集群数据分发——pyspark导出Hive集群数据及python写入mysql或sql server;

from pyspark.sql import HiveContext,SparkSession

spark_df.write.mode(mode)\
                .format("jdbc")\
                .options(url=url,user=user_name,password=password,dbtable=table_name,batchsize=batchsize,)\
                .save()
好的,下面是Python连接SQL Server实现增删查改的步骤: 1. 安装pyodbc模块 在Python中连接SQL Server需要使用pyodbc模块,所以需要先安装该模块。可以使用pip命令进行安装: ``` pip install pyodbc ``` 2. 连接数据库 连接SQL Server需要使用pyodbc.connect()函数,该函数需要传入数据库连接的参数,例如: ```python import pyodbc server = 'your_server_name' database = 'your_database_name' username = 'your_username' password = 'your_password' cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password) ``` 其中,server、database、username和password分别为你的SQL Server服务器名称、数据库名称、登录用户名和登录密码。 3. 执行SQL语句 连接成功后,就可以执行相应的SQL语句了。例如,插入一条记录可以使用如下代码: ```python cursor = cnxn.cursor() cursor.execute("INSERT INTO your_table_name (column1, column2, column3) VALUES (?, ?, ?)", value1, value2, value3) cnxn.commit() ``` 其中,your_table_name为你的表名,column1、column2和column3分别为你的表中的列名,value1、value2和value3为你要插入的具体值。 删除记录可以使用如下代码: ```python cursor = cnxn.cursor() cursor.execute("DELETE FROM your_table_name WHERE column1 = ?", value) cnxn.commit() ``` 其中,your_table_name为你的表名,column1为你的表中的列名,value为你要删除的具体值。 更新记录可以使用如下代码: ```python cursor = cnxn.cursor() cursor.execute("UPDATE your_table_name SET column1 = ? WHERE column2 = ?", new_value, old_value) cnxn.commit() ``` 其中,your_table_name为你的表名,column1和column2分别为你的表中的列名,new_value为你要更新的新值,old_value为你要更新的旧值。 查询记录可以使用如下代码: ```python cursor = cnxn.cursor() cursor.execute("SELECT * FROM your_table_name") rows = cursor.fetchall() for row in rows: print(row) ``` 其中,your_table_name为你的表名,rows为查询结果,可以通过for循环遍历输出。 以上就是Python连接SQL Server实现增删查改的全部步骤,希望能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╭⌒若隐_RowYet——大数据

谢谢小哥哥,小姐姐的巨款

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值