话不多说,直接上代码。

#!/usr/bin/python

# -*- coding:utf8 -*-

# author: chenzhixin

"""

一、安装环境:

python3

pip install pymysql

pip install pymssql

二、实现功能:

将mysql的oa_2016.formmain_5027(手机打卡记录)数据,增量同步到sqlserver数据库的kaoqin.CHECKINOUT中

三、运行方法:

a)定时任务

[root@oadb1 shell]# crontab -l

* * * * * python -W ignore /usr/local/shell/sync_mobile_kaoqin.py >> /var/log/sync_mobile_kaoqin.log 2>&1

b) 日志位置

tail -f /var/log/sync_mobile_kaoqin.log

四、测试sql:

mysql执行

select * from oa_2016.formmain_5027

sqlserver上执行

select * from CHECKINOUT where sn='手机端打卡'

"""

from contextlib import contextmanager

import pymysql as mysqldb

import pymssql as mssqldb

import time

@contextmanager

def get_mysql_conn(**kwargs):

"""

建立MySQL数据库连接

:param kwargs:

:return:

"""

conn = mysqldb.connect(host=kwargs.get('host', 'localhost'),

user=kwargs.get('user'),

password=kwargs.get('password'),

port=kwargs.get('port', 3306),

database=kwargs.get('database')

)

try:

yield conn

finally:

if conn:

conn.close()

@contextmanager

def get_mssql_conn(**kwargs):

"""

建立sqlserver数据库连接

:param kwargs:

:return:

"""

conn = mssqldb.connect(server=kwargs.get('host'),

user=kwargs.get('user'),

password=kwargs.get('password'),

database=kwargs.get('database')

)

try:

yield conn

finally:

if conn:

conn.close

def execute_mysql_select_sql(conn, sql):

"""

执行mysql的select类型语句

:param conn:

:param sql:

:return:

"""

with conn as cur:

cur.execute(sql)

rows = cur.fetchall()

return rows

def execute_mysql_sql(conn, sql):

"""

执行mysql的dml和ddl语句,不包括select语句

:param conn:

:param sql:

:return:

"""

with conn as cur:

cur.execute(sql)

def execute_mssql_sql(conn, sql):

"""

执行sqlserver的dml和ddl语句,不包含select语句

:param conn:

:param sql:

:return:

"""

with conn.cursor() as cur:

cur.execute(sql)

conn.commit()

def get_mysql_kaoqin_data(conn):

"""

获取mysql的考勤数据

:param conn:

:return:

"""

sql = "select * from formmain_5027 where field0008 is null or field0008=''"

mysql_kaoqin_data_rows = execute_mysql_select_sql(conn, sql)

return mysql_kaoqin_data_rows

def mysql_sync_to_sqlserver(mysql_conn, mssql_conn, data):

"""

把mysql的考勤数据同步到sqlserver数据库里面

:param mysql_conn:

:param mssql_conn:

:param data:

:return:

"""

for index, row in enumerate(data, 1):

ID=row[0]

state=row[1]

start_member_id=row[2]

start_date=row[3]

approve_member_id=row[4]

approve_date=row[5]

finishedflag=row[6]

ratifyflag=row[7]

ratify_member_id=row[8]

ratify_date=row[9]

sort=row[10]

modify_member_id=row[11]

modify_date=row[12]

field0001=row[13]

field0002=row[14]

field0003=row[15]

field0004=row[16]

field0005=row[17]

field0006=row[18]

field0007=row[19]

field0008=row[20]

field0009=row[21]

#向sqlserver插入数据

insert_data = """

INSERT INTO [kaoqin].[dbo].[CHECKINOUT]

([USERID]

,[CHECKTIME]

,[CHECKTYPE]

,[VERIFYCODE]

,[SENSORID]

,[Memoinfo]

,[WorkCode]

,[sn]

,[UserExtFmt]

,[Synced])

VALUES

((select userid from USERINFO where BADGENUMBER='{userid}'),

'{CHECKTIME}', 'I', 1, 1, NULL, 0, '手机端打卡', 0, null

)""".format(userid=field0002, CHECKTIME=start_date)

execute_mssql_sql(mssql_conn, insert_data)

print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))

print('###############第{}条手机打卡记录###############\n'.format(index), insert_data)

marked_sql = "update formmain_5027 set field0008='synced' where id={}".format(ID)

execute_mysql_sql(mysql_conn, marked_sql)

def main():

mysql_conn_args = dict(user='root', host='127.0.0.1', password='*******', database='oa_2016')

mssql_conn_args = dict(host='172.x.x.x', user='sa', password='********', database='kaoqin')

with get_mysql_conn(**mysql_conn_args) as mysql_conn:

mysql_data = get_mysql_kaoqin_data(mysql_conn)

with get_mssql_conn(**mssql_conn_args) as mssql_conn:

mysql_sync_to_sqlserver(mysql_conn, mssql_conn, mysql_data)

if __name__ == '__main__':

main()

定时任务:

[root@oadb1 shell]# crontab -l

#定时同步手机考勤给sqlserver

* * * * * python -W ignore /usr/local/shell/sync_mobile_kaoqin.py >> /var/log/sync_mobile_kaoqin.log 2>&1

日志:

[root@oadb1 shell]# tail -100f /var/log/sync_mobile_kaoqin.log

2019-10-20 09:04:01

###############第1条手机打卡记录###############

INSERT INTO [kaoqin].[dbo].[CHECKINOUT]

([USERID]

,[CHECKTIME]

,[CHECKTYPE]

,[VERIFYCODE]

,[SENSORID]

,[Memoinfo]

,[WorkCode]

,[sn]

,[UserExtFmt]

,[Synced])

VALUES

((select userid from USERINFO where BADGENUMBER='1234'),

'2019-10-19 14:50:25', 'I', 1, 1, NULL, 0, '手机端打卡', 0, null

)

python和sqlserver_利用python实现mysql数据库向sqlserver的同步相关推荐

  1. python操作Oracle、PostgreSQL,MySql数据库增删改查

    python操作Oracle.PostgreSQL,MySql数据库增删改查,工作中可运行案例,直接上代码,供大家参考. # _*_ coding:UTF-8 _*_#import ServerCon ...

  2. 【Python例】利用 python 进行用户画像词云图的生成 --- wordcloud

    [Python例]利用 python 进行用户画像词云图的生成 - wordcloud 本文主要用于记录,并使用 python 脚本进行用户画像的词云图的生成. 前言 对于词云图来说,是一个用户画像数 ...

  3. 利用ECharts可视化mysql数据库中的数据

    利用ECharts可视化mysql数据库中的数据 技术实现背景 在我们的日常开发中我们经常使用到各种各样的数据进行相关的功能的开发,在这个过程中我们可以用到各种各样的图表来分析和实现我们的需求,很多的 ...

  4. 如何在Windows下利用Apche查看MySQL数据库?

    本篇文章主要跟大家介绍的是如何在Windows下利用Apche查看MySQL数据库,小杜觉得挺实在的,就整理了一下并分享给大家做个参考,希望大家看完之后有一定的收获.因此,有感兴趣的朋友记得要看完! ...

  5. 【Python例】利用 python 进行图片文字信息的提取 --- OCR-EasyOCR

    [Python例]利用 python 进行图片文字信息的提取 - OCR-EasyOCR 本文主要用于记录,并使用 python 脚本进行图片文字信息的生成. 什么是 OCR? OCR OCR(Opt ...

  6. zipkin mysql_利用 Zipkin 追踪 Mysql 数据库调用链

    概述 在前面:微服务调用链追踪中心搭建 一文中我们利用 Zipkin 搭建了一个微服务调用链的追踪中心,并且模拟了微服务调用的实验场景.利用 Zipkin 的库 Brave,我们可以收集一个客户端请求 ...

  7. boxplot用法 python,[Python画图笔记]利用Python画箱型图boxplot

    [Python画图笔记]利用Python画箱型图boxplot [Python画图笔记]利用Python画箱型图boxplot 最近在学习使用Python画图,想用subplot画两幅箱型图,分别用来 ...

  8. MYSQL数据库跨服务器实时同步更新实践----文献阅读(污水管网水质预测)

    文章目录 摘要 一. MYSQL 数据库主从复制,实时同步的再现 1. 1 先下载虚拟机(硬件)与lunxi系统(centos7) 1.2 在lunxi 系统安装rpm 版mysql 5.5.55 1 ...

  9. linux同步两台mysql数据,Mysql入门MySQL 数据库两台主机同步实战(linux)

    <Mysql入门MySQL 数据库两台主机同步实战(linux)>要点: 本文介绍了Mysql入门MySQL 数据库两台主机同步实战(linux),希望对您有用.如果有疑问,可以联系我们. ...

最新文章

  1. 使用Composer安装Laravel步骤
  2. 2019年度苏州之春摄影作品展
  3. java 耗时_Java使用简单的方法计算代码耗时
  4. ftp软件哪个好用_和平精英录屏软件哪个好用 和平精英录屏软件介绍
  5. linux控制台编辑模式下换行,linux控制台命令的换行识别问题
  6. 【Pytorch神经网络理论篇】 16 过拟合问题的优化技巧(三):批量归一化
  7. 【dp】URAL-1018
  8. 2.5、Android Studio添加多适配的向量图片
  9. python编程入门与案例详解-干货|| 清华大佬推荐的python400集入门资料
  10. 假疫苗事件,错在企业,责任在管理部门
  11. mysql中乘积函数_Mysql中的函数
  12. 黑客帝国屏保源码!快拿去试试吧!炫酷无比!
  13. CXF框架介绍及Spring集成
  14. windows xp sp3下载
  15. 魅族16s解决杀后台方法!
  16. Bootstrap Slider轮播图片样式控制
  17. 关于相机坐标到投影空间坐标转换的理解
  18. JSP四大作用域,九大内置对象
  19. Apache CXF框架简介
  20. Modbus通信模式有哪几种?各自的特点有哪些?

热门文章

  1. android应用资源可以分为两大类,Android 应用资源(一)
  2. python列表map函数_python中map函数怎么显示结果
  3. html 换行符_每个非网站开发人员都应该了解的21个HTML基础知识
  4. idea调试debug技巧_这几个IDEA高级调试技巧,用了都说好!
  5. Docker 解决容器时间与主机时间不一致的问题三种解决方案
  6. 试用期没过,因在公司上了1024网站...
  7. 漫画 | 这样的男朋友,让我分分钟想剖腹自尽!
  8. Python 官网宣布,正式发布 Python 3.8.0!
  9. java的static和private_static关键字什么意思?Java中是否可以覆盖一个private或者是static的方法?...
  10. 机器学习基础-弹性网 Elastic Net-08