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

目 录

    • 1. 问题场景
    • 2. `import pymssql`代码案例
    • 3. `from sqlalchemy import create_engine`代码案列
    • 4.`pyspark` 操作sql server默认就是自动提交

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,python,sqlserver,pymssql,sqlalchemy,create_engine)