python 操作MySQL数据库

272 阅读3分钟

本地操作MySQL

python 版本 >=3.4之后,需要使用连接的库为PyMySQL

安装方法也很简单

 pip install PyMySQL

PyMySQL: 封装了MySQL驱动的python驱动,能使python连接到MySQL

步骤

  • 连接数据库
  • 生成游标对象
  • 执行SQL语句
  • 关闭游标
  • 关闭连接

此文章默认已在本地的MySQL创建好数据库

代码如下:

 import pymysql
 class Mysql(object):
 ​
     def __init__(self):
         try:
             self.conn = pymysql.connect(
             host='127.0.0.1',   #连接名称,本地地址默认127.0.0.1
             user='root',        #用户名
             passwd='123456',    #密码
             port=3306,          #端口,默认3306
             db='demo',          #数据库名称
             charset='utf8'      #字符编码
             )
          except Exception as e:
             print(e)
          else:
             print('连接成功!')
             #获取游标
             self.cur = self.conn.cursor()
 #执行操作:创建,增删改查
      #创建表
      def create(self):
         try:
             sql = '''
                 CREATE TABLE Student(
                     Id INT PRIMARY KEY,
                     Name CHAR(20),
                     Age CHAR(20)
                 )
             '''
             #执行sql语句
             selg.excute(sql)
         except Exception as e:
             print(e)
             print('创建失败')
         else:
             print('创建成功')
             
       #增加语句
       def add(self):
             sql = '''INSERT INTO Student VALUES (1,'小明',15),(2,'小红',16)'''
             result =self.cur.excute(sql)
             if result:
                 #提交增加的数据到表中
                 self.conn.commit()
                 print('插入成功')
             else:
                 self.conn.rollback()
                 print('插入失败')
        #删除语句
        def  delete(self):
             sql =  '''DELETE from Student where Id=2'''
             result =self.cur.excute(sql)
             if result:
                 self.conn.commit()
                 print('删除成功')
             else:
                 self.conn.rollback()
                 print('删除失败')
        
         #修改语句
        def  update(self):
             sql =  '''UPDATE Student SET Name='小明' where Id=3'''
             result =self.cur.excute(sql)
             if result:
                 self.conn.commit()
                 print('修改成功')
             else:
                 self.conn.rollback()
                 print('修改失败')
                
             
         #查询语句
        def  inquire(self):
             sql =  '''SELECT * from Student'''
             self.cur.excute(sql)
             #用fetchall获取所有数据,以元组的形式显示出来,注意:fetchone时获取一条数据,同样也是以元组的形式显示出来
             result = self.cur.fetchall()
             for i in result:
                 print(i)
         #关闭        
         def close(self):
             self.cur.close()
             self.conn.close()
             
                 
                 

远程操作MySQL

远程即非本地的数据库,目标数据库放在了服务器上

与本地连接MySQL的区别在于,需要使用额外的sshtunnel库中的SSHTunnelForwarder函数,在函数里面带上服务器登录信息参数就可

为啥要使用SSHTunnelForwarder隧道连接mysql

考虑到安全因素,服务器只允许通过ssh访问连接。也就是说如果数据库放在了服务器A上,只允许服务器B来访问,而自己在本机C上,那么就要通过ssh连接服务器B,再来连接服务器A,这样就可以达到目的(本机C访问服务器A上的数据)

通俗一点来说,在本机上,我一般用xshell来连接远程服务器。xshell就可以当作是服务器B,它当作中介者的角色

步骤

  • 连接ssh
  • 再通过ssh连接数据库
  • 生成游标对象
  • 执行SQL语句
  • 关闭游标
  • 关闭连接

代码如下:

 import pymysql
 import sshtunnel
 from sshtunnel import SSHTunnelForwarder
 ​
 class Mysql(object):
     def __init__(self):
         try:
             with SSHTunnelForwarder(
                 ('xx.xxx.xx.xx',22),  #这里填写服务器的IP地址,端口是22
                 ssh_username = "root",# ssh的用户名
                 ssh_password = "pwd", #ssh的密码
                 remote_bind_address=('xx.xxx.xx.xx',3306)) as server:
             print('SSH连接成功')        #这里也是填写服务器的IP地址,端口是MySQL的3306端口
             
             conn = pymysql.connect(
                 host='127.0.0.1',
                 port=server.local_bind_port,
                 user='',
                 passwd='',
                 db=''         
             ) 
          except Exception as e:
             print(e)
          else:
             print('连接成功!')
             #获取游标
             self.cur = self.conn.cursor()
             print('游标获取成功')
    #增加语句
     def add(self):
           sql = '''INSERT INTO Student VALUES (1,'小明',15),(2,'小红',16)'''
           result =self.cur.excute(sql)
           if result:
               #提交增加的数据到表中
               self.conn.commit()
               print('插入成功')
           else:
               self.conn.rollback()
               print('插入失败')   
             
     def close(self):
         self.cur.close()
         self.conn.close()