python边写边学习——简单的svn同步(一)
学python有一小段时间了,但是没有实际项目练手,仅从一些脚本开始比较的吃力。最近需要运维一些服务器,正好使用python来练手,也回顾一下相关知识。
首先python的项目作用是,博主有10台负载服务器,那么同步代码的时候异常的心塞。(暂时使用的是SVN还没有切换到gitlab)有试过相关的开源软件,如walle,讲真还是挺不错的就是博主玩的时候很心塞,3~5台服务器的代码更新还行,多了就各种bug出来了(可能是我用法不对= =。)而且博主也没有需要使用回滚、分线下预发等功能,所以想想还是自己写一个。
首先是python连接数据库。讲真使用python不大习惯,因为python查询的数据基本上都是没有栏名称的,要得到某个列的数据需要使用下标获取,感觉有点坑。或许有相应方法我没有找到,这里暂时记录下相关实例类。后续更新和维护以达成比较好的数据结构直接使用.
先贴上目录结构:
知识点一,__init__.py
当你将一个包作为模块导入(比如从 xml 导入 dom )的时候,实际上导入了它的 init.py 文件。一个包是一个带有特殊文件 _init_.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。__init__.py 文件会在导入时被执行。所以初学者like me,在调用不同文件层次的不同文件时候,需要在每个文件夹下创建__init__.py文件知识点二 __init__方法和__new__方法
__new__方法接受的参数虽然也是和__init__一样,但__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。__new__方法还涉及到metaclass的关联,这个下篇博客单独研究。
其中dal为数据库操作相关文件,send为触发脚本;tornado_web为tornado框架,即使用web框架监听和接收相关指令。附上tornado的web框架链接:
http://www.cnblogs.com/kongqi816-boke/p/5699866.html 这里不重点研究。
首先贴下python操作实例,这里使用的pymysql,很简单的安装方式,直接pip install pymysql即可。这里使用的python2语法。
# -*- coding: utf-8 -*-
import mysqlConfig
import pymysql
class mysqlConnect:
connectInstance = None
cursorInstance = None
'''设置实例'''
def set_db_instance(self):
self.connectInstance = pymysql.connect(
host=mysqlConfig.hostname, port=mysqlConfig.port, user=mysqlConfig.username, password=mysqlConfig.password,
db=mysqlConfig.database
)
self.cursorInstance = self.connectInstance.cursor()
'''获取connect实例'''
def get_db_instance(self):
if self.connectInstance is None:
self.set_db_instance()
return self.connectInstance
'''获取cursor实例'''
def get_cursor_instance(self):
if self.connectInstance is None:
self.get_db_instance()
return self.cursorInstance
def __del__(self):
if self.connectInstance is not None:
self.connectInstance.close()
if self.cursorInstance is not None:
self.cursorInstance.close()
以上有个知识点没有特别明白,即类的private和public属性。理想方式是仅有一个出口,想把除了获取实例的两个方法外其他方法和属性都设置为private属性。
外部调用类:
import mysqldb
import time
mysqldb = mysqldb.mysqlConnect()
connect = mysqldb.get_db_instance()
cursor = mysqldb.get_cursor_instance()
'''插入数据库
@property taskId 任务Id
@property host 主机IP
@property info 记录消息
@property status 状态
'''
def insertRecord(taskId,host,info,status):
timeStamp = time.time()
sql = "insert into record(task_id,host,info,status,ctime) VALUES (%d,'%s','%s',%d,%d)"%(taskId,host,info,status,timeStamp)
cursor.execute(sql)
connect.commit()
这里mark一下点,connect需要手动commit,好像有个设置可以自动提交。
接下来是配置类:
hostname = '127.0.0.1' #数据库host
port = 3306 #数据库端口
database = 'svn_update' #数据库
username = 'root' #账号
password = '' #密码
projectPath = '/data/www/test' #项目路径