Python 运维开发 学习记录 语言基础(五)

Shell/Python   socket   MySQLdb  

一、Python MySQL交互

  • 常用函数
commit()          提交  
rollback()        回滚  
cursor            用来执行命令的方法:  
callproc(self, procname, args)     用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数  
execute(self, query, args)         执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数  
executemany(self, query, args)     执行单挑sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数  
nextset(self)    移动到下一个结果集  
cursor           用来接收返回值的方法  
fetchall(self)   接收全部的返回结果行.  
fetchmany(self, size=None)         接收size条返回结果行.如果size的值大于返回的结果行的数量,则会返回cursor.arraysize条数据.  
fetchone(self)   返回一条结果行.  
scroll(self, value, mode='relative')   移动指针到某一行.如果mode='relative',则表示从当前所在行移动value条,如果 mode='absolute',则表示从结果集的第一行移动value条.  
  • 示例
    创建一个mysql库dbtest
CREATE TABLE `testtbl` (  
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` char(20) NOT NULL,
  `sex` int(4) NOT NULL DEFAULT '0',
  `degree` double(16,2) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=latin1
#!/usr/bin/python
#_*_coding:utf-8_*_
import MySQLdb

try:  
        conn=MySQLdb.connect(host='localhost',user='root',passwd='redhat',db='py_s10',port=3306)
        cur=conn.cursor()
        data_list = []
        for i in range(10):
                data_list.append(('leo_%s' % i,i,i))
        #insert_data = "insert into testtbl values(0,%s,%s,%s)"
        #cur.execute(insert_data,('imdst',1,6.88))      #执行单条SQL语句
        #cur.executemany(insert_data,data_list)         #执行单条SQL语句,但是重复执行参数列表里的参数
        cur.execute('select * from testtbl')
        #print cur.fetchall()                   #接受全部的返回行
        #print cur.fetchone()                   #返回一条结果行

        #query_res = cur.fetchmany(20)          #按Size条返回结果行
        #query_res = cur.fetchall()             #返加全部行
        cur.scroll(3,mode='relative')           #从当前所在行移动5条
        print cur.fetchone()

        cur.scroll(2,mode='relative')           #从当前所在行移动5条
        print cur.fetchone()

        cur.scroll(3,mode='absolute')           #从结果集的第一行移动5条
        print cur.fetchone()

        #conn.rollback()                        #回滚
        #conn.commit()                          #提交

        cur.close()
        conn.close()

except MySQLdb.Error,e:  
        print "MySQL Err:",e

二、Socket 编程

  • socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
  • 简单的说就是建立连接发送和接收。 (C/S)
  • Socket通信步骤
    • 打开一个Socket
    • 绑定/连接到一个地址和端口
    • 侦听进来的连接
    • 接受连接
    • 读写数据
  • socket 类型
    • socket.AF_UNIX 只能够用于单一的Unix系统进程间通信
    • socket.AF_INET 服务器这间的网络通信
    • Socket.AF_INET6 IPV6
    • socket.SOCK_STREAM 流式Socket,for TCP
    • socket.SOCK_DGRAM 数据报式socket,for UDP
  • socket 函数
    • socket(famliy,type,[protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字
    • s.bind(address) 将套接字绑定到地址。address地址的格式取决于地址族。在AF_INET下,以元组(host,port)的形式表示地址
    • s.listen(backlog) 开始监听传入连接。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了
    • s.connect(address) 连接到address处的套接字。一般,address的格式为元组(hostname,port),如果连接同一台机器上的服务器,可以将hostname设为‘localhost’。 如果连接出错,返回socket.error错误。
    • s.accept() 接受连接并返回(conn,address),其中conn是新的套接字对象,可以用来接收和发送数据。address是连接客户端的地址。
    • s.close() 关闭套接字。
  • 简单的sock服务端和客户端
#!/usr/bin/python
#_*_coding:utf-8_*_
# sock_server.py
import socket

HOST = ''                 # Symbolic name meaning all available interfaces  
PORT = 50007              # Arbitrary non-privileged port  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
s.bind((HOST, PORT))  
s.listen(1)  
conn, addr = s.accept()

print 'Connected by', addr  
while 1:  
    data = conn.recv(1024)
    if not data: break
    conn.sendall(data)
conn.close()  
#!/usr/bin/python
#_*_coding:utf-8_*_
# sock_client.py
import socket

HOST = '127.0.0.1'                 # Symbolic name meaning all available interfaces  
PORT = 50007              # Arbitrary non-privileged port  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
s.connect((HOST,PORT))

s.sendall('Hello,World')  
data = s.recv(1024)  
s.close()  
print 'Received',data  
  • socket 多并发
#!/usr/bin/python
#thread_sock_server.py
import SocketServer

class MyTCPHandler(SocketServer.BaseRequestHandler):

        def handle(self):
                while True:
                        self.data = self.request.recv(1024).strip()
                        print "{} wrote:".format(self.client_address[0])
                        print self.data
                        self.request.sendall(self.data.upper())

if __name__ == "__main__":

        HOST,PORT = "localhost",9000

        server = SocketServer.ThreadingTCPServer((HOST,PORT),MyTCPHandler)

        server.serve_forever()