目 录
1. 问题场景
由于平时博主都是python操作mysql比较多,python处理sql server
极为少见,但最近发现python在操作sql server的insert 、update、delete、truncate table
等改变表数据内容的DML语句时,必须手动提交;这里以import pymssql
和from 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()