|
|
|
|
移动端

一步一步教你如何用Python操作MySQL

本文一步一步教你如何用Python操作MySQL。工欲善其事,必先利其器。所以第一步,我们先下载第三方库。在这里,我用到的是pymysql库。

作者:sergiojune来源:Python爱好者社区|2018-03-07 15:24

一步一步教你如何用Python操作MySQL

工欲善其事,必先利其器。所以第一步,我们先下载第三方库。在这里,我用到的是pymysql库。

下载库:在命令行输入

  1. pip install pymysql 

下载后可检验一下是否成功下载。直接在命令行进入python然后导库即可

  1. C:\Users\June>python 
  2. Python 3.6.3 |Anaconda, Inc.| (default, Oct 15 2017, 03:27:45) [MSC v.1900 64 bit (AMD64)] on win32 
  3. Type "help""copyright""credits" or "license" for more information. 
  4. >>> import pymysql 
  5. >>> 

看到这个画面就说明下载成功了,接下来学习如何操作数据库了!!!

连接数据库

  1. import pymysql 
  2. # 连接数据库 
  3. db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8'

以上的参数是必填的

  • host: 这个是ip地址,因为我这里是本地的,所以填127.0.0.1,也可以填localhost。
  • user:用户名,如果你也是本地的,就填root好了
  • passwd:这个是密码,填上你自己设的密码就可以了
  • db:这个是数据库名,我这里选的是news数据库
  • port:这个是端口,本地的一般都是3306
  • charset:这个是编码方式,要和你数据库的编码方式一致,要不会连接失败

连接上了,怎么验证呢?这里我们可以选择查一条数据

  1. try: 
  2.  db = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',db='news',port=3306,charset='utf8' 
  3.  # 检验数据库是否连接成功  
  4.  cursor = db.cursor()  
  5.  # 这个是执行sql语句,返回的是影响的条数  
  6.  data = cursor.execute('SELECT * FROM `new`' 
  7.  # 得到一条数据  
  8.  one = cursor.fetchone()  
  9.  print(data)  
  10.  print(one)  
  11.  except pymysql.Error as e:  
  12.  print(e)  
  13.  print('操作数据库失败' 
  14.  finally:  
  15.  # 如果连接成功就要关闭数据库  
  16.  if db:  
  17.  db.close() 

代码解读:因为在连接数据库中,有时会发生连接失败等异常,所以这里就进行捕捉异常,这里的异常都是在 pymsql.Error 里面。上面的代码看不懂也没关系,因为我接下来会说,如果运行后有结果证明连接成功。

在用完后,一定要记得关闭数据库连接,防止资源泄露问题。

对数据进行查询

  1. import pymysql  
  2.  try:  
  3.   conn = pymysql.connect(host='127.0.0.1',user='root',passwd='password',db='news',charset='utf8',port=3306)  
  4.   # 这个是光标,用来操作数据库语句  
  5.   cursor = conn.cursor()  
  6.   # 执行sql语句 
  7.   cursor.execute('SELECT * FROM `new`' 
  8.   print(cursor.fetchone())  
  9.   # 关闭光标  
  10.  cursor.close()  
  11. except pymysql.Error as e:  
  12.  print(e)  
  13.  print('操作数据库失败' 
  14. finally:  
  15.  if conn:  
  16.  conn.close() 

代码解读:

  • cursor():这个是光标,用来执行mysql语句的,用完后也是需要关闭的
  • excute():这个是执行语句,执行参数的mysql语句
  • fetchone():这个是查看执行语句后的一条数据
  • fetchall():这个是查看所有数据

在查询数据后,返回的是一整条数据,有没有可以按字典形式来查询的呢?来试试!

  1. print(cursor.fetchone()['name'])  
  2. Traceback (most recent call last):  
  3. File "E:/anaconda/python_project/mysql_test/test2.py", line 8, in <module>  
  4. print(cursor.fetchone()['name'])  
  5. TypeError: tuple indices must be integers or slices, not str 

查了之后,编译器想都不想就给了我这个错误,说这是个元组,不能这样操作。

虽然python没有提供,但是我们可以手动转成字典来查询啊

cursor这里有个属性:description。获取的是数据库每个栏位情况,如下:

  1. print(cursor.description)  
  2. # 下面是结果  
  3. (('id', 3, None, 11, 11, 0, False), ('type', 253, None, 5, 5, 0, False), ('title', 253, None, 50, 50, 0, False), ('content', 253, None, 2000, 2000, 0, False), ('view_count', 3, None, 11, 11, 0, False), ('release_time', 12, None, 19, 19, 0, False), ('author', 253, None, 20, 20, 0, True), ('from', 253, None, 20, 20, 0, True), ('is_valibale', 3, None, 11, 11, 0, False

所以,我们利用这个属性手动生成字典

  1. # 将一条数据转成字典方便查找  
  2. new = dict(zip([x[0] for x in cursor.description],[x for x in cursor.fetchone()]))  
  3. print(new)  
  4. # 下面是结果  
  5. {'id': 2, 'type''NBA''title''考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福''content''他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击''view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author''xiaoylin''from''腾讯体育''is_valibale': 1} 

这里利用zip函数和列表生成式来一行代码就生成成功了

用字典来查询,现在就可以了

  1. print(new['title'])  
  2. # 下面是结果  
  3. 考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福 

但是,上面的只是一条数据的,如果是多条的呢?再按上面的方法就行不通了。这时就需要用到map函数了

  1. def new2dict(new):  
  2.  return dict(zip([x[0] for x in cursor.description],[x for x in new]))  
  3. news_list = list(map(new2dict,cursor.fetchall()))  
  4. print(news_list)  
  5. # 下面是结果  
  6. [{'id': 2, 'type''NBA''title''考辛斯跟腱撕裂赛季报销 浓眉詹皇发声祝福''content''他遭遇左脚跟腱撕裂,将缺席赛季剩下的比赛。这无疑对考辛斯和鹈鹕队都是一个重大的打击''view_count': 3560, 'release_time': datetime.datetime(2018, 1, 27, 12, 10), 'author''xiaoylin''from''腾讯体育''is_valibale': 1}, {'id': 3, 'type''NBA''title''火箭挖21分大哈登得背锅 连遭浓眉大帽太尴尬''content''火箭在客场以113-115惜败于鹈鹕,4连胜终结。詹姆斯-哈登出战34分钟16投5中,其中三分球9投只有1中,罚球14罚12中,拿到23分、11助攻、5篮板但也有4次失误,其在场正负值为尴尬的-12分''view_count': 7520, 'release_time': datetime.datetime(2018, 1, 27, 12, 5), 'author''youngcao''from''腾讯体育','is_valibale': 1}, {'id': 4, 'type''英超''title''足总杯-曼联4-0英乙球队晋级 桑神首秀造两球''content''2017-18赛季英格兰足总杯第4轮,曼联客场4比0击败英乙球队约维尔,顺利晋级下一轮。桑切斯迎来曼联首秀,并制造了两个入球''view_count': 6560, 'release_time': datetime.datetime(2018, 1, 27, 5, 49), 'author''ricazhang''from''腾讯体育','is_valibale': 1}, {'id': 5, 'type''英超''title''这才配红魔7号!桑神首秀大腿级表演 回击嘘声质疑''content''在今天凌晨对阵约维尔的首秀也值得期待。虽然在登场的72分钟时间里没有进球,但送出1次助攻且有有6次威胁传球的数据还是十分亮眼''view_count': 2760, 'release_time': datetime.datetime(2018, 1, 27, 6, 13), 'author''yaxinhao''from''腾讯体育''is_valibale': 1}] 

这里很巧妙的利用了map函数,因为多条数据就可以进行迭代了,需要操作每条数据,这样就可以想到map函数

接下来我们再用面向对象的方法来用python进行查询数据库

  1. import pymysql  
  2.  class MysqlSearch(object): 
  3.   def get_conn(self):  
  4.   '''连接mysql数据库'''  
  5.   try:  
  6.   self.conn = pymysql.connect(host='127.0.0.1',user='root',passwd='your password',port=3306,charset='utf8',db='news' 
  7.   except pymysql.Error as e:  
  8.   print(e)  
  9.   print('连接数据库失败' 
  10.  def close_conn(self):  
  11.  '''关闭数据库'''  
  12.  try:  
  13.  if self.conn:  
  14.  self.conn.close()  
  15.  except pymysql.Error as e:  
  16.  print(e)  
  17.  print('关闭数据库失败' 
  18.   
  19.  def get_one(self):  
  20.  '''查询一条数据'''  
  21.  try:  
  22.  # 这个是连接数据库  
  23.  self.get_conn()  
  24.  # 查询语句  
  25.  sql = 'SELECT * FROM `new` WHERE `type`=%s'  
  26.  # 这个光标用来执行sql语句  
  27.  cursor = self.conn.cursor()  
  28.  cursor.execute(sql,('英超',))  
  29.  new = cursor.fetchone()  
  30.  # 返回一个字典,让用户可以按数据类型来获取数据  
  31.  new_dict = dict(zip([x[0] for x in cursor.description],new))  
  32.  # 关闭cursor  
  33.  cursor.close()  
  34.  self.close_conn()  
  35.  return new_dict  
  36.  except AttributeError as e:  
  37.  print(e)  
  38.  return None  
  39.  def get_all(self):  
  40.  '''获取所有结果'''  
  41.  sql = 'SELECT * FROM `new` '  
  42.  self.get_conn()  
  43.  try:  
  44.  cursor = self.conn.cursor()  
  45.  cursor.execute(sql)  
  46.  news = cursor.fetchall()  
  47.  # 将数据转为字典,让用户根据键来查数据  
  48.  news_list =list(map(lambda x:dict(zip([x[0] for x in cursor.description],[d for d in x])),news))  
  49.  # 这样也行,连续用两个列表生成式  
  50.  news_list = [dict(zip([x[0] for x in cursor.description],row)) for row in news]  
  51.  cursor.close()  
  52.  self.close_conn()  
  53.  return news_list  
  54.  except AttributeError as e:  
  55.  print(e)  
  56.  return None  
  57.   
  58. def main():  
  59.  # 获取一条数据  
  60.  news = MysqlSearch()  
  61.  new = news.get_one()  
  62.  if new:  
  63.  print(new)  
  64.  else 
  65.  print('操作失败' 
  66.   
  67.  # 获取多条数据  
  68.  news = MysqlSearch()  
  69.  rest = news.get_all()  
  70.  if rest:  
  71.  print(rest)  
  72.  print(rest[7]['type'],rest[7]['title'])  
  73. print('类型:{0},标题:{1}'.format(rest[12]['type'],rest[12]['title']))  
  74.  for row in rest:  
  75.  print(row)  
  76.  else 
  77.  print('没有获取到数据' 
  78.   
  79. if __name__ == '__main__' 
  80.  main() 

这样就可以通过实例的方法来进行查询数据库了

我们还可以根据页数来进行查询指定的数据数

  1.  def get_more(self,page,page_size):  
  2.  '''查多少页的多少条数据'''  
  3.  offset = (page-1)*page_size  
  4.  sql = 'SELECT * FROM `new` LIMIT %s,%s'  
  5.  try:  
  6. self.get_conn()  
  7.  cursor = self.conn.cursor()  
  8.  cursor.execute(sql,(offset,page_size,))  
  9.  news = [dict(zip([x[0] for x in cursor.description],new)) for new in cursor.fetchall()]  
  10.  cursor.close()  
  11.  self.close_conn()  
  12.  return news  
  13.  except AttributeError as e:  
  14.  print(e)  
  15.  return None  
  16.   
  17. def main():  
  18.  #获取某页的数据  
  19.  news = MysqlSearch()  
  20.  new = news.get_more(3,5)  
  21.  if new:  
  22.  for row in new:  
  23.  print(row)  
  24.  else 
  25.  print('获取数据失败' 
  26.  
  27. if __name__ == '__main__' 
  28.  main() 

利用的是mysql的limit关键字,还有其他的,比如进行排序分组的感兴趣的可以自己尝试下

增加数据到数据库

  1. def add_one(self):  
  2.  sql = 'INSERT INTO `new`(`title`,`content`,`type`,`view_count`,`release_time`) VALUE(%s,%s,%s,%s,%s)'  
  3. try:  
  4.  self.get_conn()  
  5.  cursor = self.conn.cursor()  
  6.  cursor.execute(sql, ('title''content''type''1111''2018-02-01'))  
  7.  cursor.execute(sql, ('标题''内容''类型''0000''2018-02-01'))  
  8.  # 一定需要提交事务,要不不会显示,只会占位在数据库  
  9.  self.conn.commit()  
  10.  return 1  
  11.  except AttributeError as e:  
  12.  print('Error:', e)  
  13.  return 0  
  14.  except TypeError as e:  
  15.  print('Error:', e)  
  16.  # 发生错误还提交就是把执行正确的语句提交上去  
  17.  # self.conn.commit()  
  18.  # 下面这个方法是发生异常就全部不能提交,但语句执行成功的就会占位  
  19.  self.conn.rollback()  
  20.  return 0  
  21.  finally:  
  22.  cursor.close()  
  23.  self.close_conn()  
  24.  def main():  
  25.  news = OperateSQL()  
  26.  if news.add_one():  
  27.   print('增加数据成功' 
  28.  else 
  29.   print('发生异常,请检查!!!' 
  30.  if __name__ == '__main__' 
  31.  main() 

因为是增加数据,所以需要提交事务,这就需要用到conn  .commit()来进行提交,在增加数据后,如果不提交,数据库就不会显示。

还有修改数据和删除数据就不贴出来了,只是把上面的sql变量的语句改成修改或者删除的语句就可以了,如果你还不会,建议练习下

【编辑推荐】

  1. 如何面试Python后端工程师?
  2. 看完此文再不懂区块链算我输,用Python从零开始创建区块链
  3. HackerRank开发者调查报告:Python最受欢迎
  4. 教老婆学Python是怎样一种体验
  5. 我用Python爬了4400条淘宝商品数据,竟发现了这些“潜规则”
【责任编辑:庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

计算机病毒防范艺术

本书由Symantec首席反病毒研究员执笔,是讲述现代病毒威胁、防御技术和分析工具的权威指南。与多数讲述计算机病毒的书籍不同,本书完全是...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊