首页 >  Python开发 >  Python操作MySQL存储,这些你都会了吗?

Python操作MySQL存储,这些你都会了吗?

发布时间:2019-5-20 17:39阅读量:18
摘要: 在Python 2中,连接MySQL的库大多是使用MySQLdb,但是此库的官方并不支持Python 3,所以这里推荐使用的库是PyMySQL。
Python操作MySQL存储,这些你都会了吗?


3. 创建表

一般来说,创建数据库的操作只需要执行一次就好了。当然,我们也可以手动创建数据库。以后,我们的操作都在spiders数据库上执行。

创建数据库后,在连接时需要额外指定一个参数db。

接下来,新创建一个数据表students,此时执行创建表的SQL语句即可。这里指定3个字段,结构如下所示。

创建该表的示例代码如下:

  1. import pymysql 
  2.  
  3. db = pymysql.connect(host='localhost'user='root'password='123456', port=3306, db='spiders'
  4. cursor = db.cursor() 
  5. sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))' 
  6. cursor.execute(sql) 
  7. db.close() 

运行之后,我们便创建了一个名为students的数据表。

当然,为了演示,这里只指定了最简单的几个字段。实际上,在爬虫过程中,我们会根据爬取结果设计特定的字段。

4. 插入数据

下一步就是向数据库中插入数据了。例如,这里爬取了一个学生信息,学号为20120001,名字为Bob,年龄为20,那么如何将该条数据插入数据库呢?示例代码如下:

  1. import pymysql 
  2.  
  3. id = '20120001' 
  4. user = 'Bob' 
  5. age = 20 
  6.  
  7. db = pymysql.connect(host='localhost'user='root'password='123456', port=3306, db='spiders'
  8. cursor = db.cursor() 
  9. sql = 'INSERT INTO students(id, name, age) values(%s, %s, %s)' 
  10. try: 
  11.     cursor.execute(sql, (id, user, age)) 
  12.     db.commit() 
  13. except
  14.     db.rollback() 
  15. db.close() 

这里首先构造了一个SQL语句,其Value值没有用字符串拼接的方式来构造,如:

  1. sql = 'INSERT INTO students(id, name, age) values(' + id + ', ' + name + ', ' + age + ')' 

这样的写法烦琐而且不直观,所以我们选择直接用格式化符%s来实现。有几个Value写几个%s,我们只需要在execute()方法的第一个参数传入该SQL语句,Value值用统一的元组传过来就好了。这样的写法既可以避免字符串拼接的麻烦,又可以避免引号冲突的问题。

之后值得注意的是,需要执行db对象的commit()方法才可实现数据插入,这个方法才是真正将语句提交到数据库执行的方法。对于数据插入、更新、删除操作,都需要调用该方法才能生效。

接下来,我们加了一层异常处理。如果执行失败,则调用rollback()执行数据回滚,相当于什么都没有发生过。

这里涉及事务的问题。事务机制可以确保数据的一致性,也就是这件事要么发生了,要么没有发生。比如插入一条数据,不会存在插入一半的情况,要么全部插入,要么都不插入,这就是事务的原子性。另外,事务还有3个属性——一致性、隔离性和持久性。这4个属性通常称为ACID特性,具体如下表所示。

  1. try: 
  2.     cursor.execute(sql) 
  3.     db.commit() 
  4. except
  5.     db.rollback() 

这样便可以保证数据的一致性。这里的commit()和rollback()方法就为事务的实现提供了支持。

上面数据插入的操作是通过构造SQL语句实现的,但是很明显,这有一个极其不方便的地方,比如突然增加了性别字段gender,此时SQL语句就需要改成:

  1. INSERT INTO students(id, name, age, gender) values(%s, %s, %s, %s) 

相应的元组参数则需要改成:

  1. (id, name, age, gender) 

这显然不是我们想要的。在很多情况下,我们要达到的效果是插入方法无需改动,做成一个通用方法,只需要传入一个动态变化的字典就好了。比如,构造这样一个字典:

  1.     'id''20120001'
  2.     'name''Bob'
  3.     'age': 20 

然后SQL语句会根据字典动态构造,元组也动态构造,这样才能实现通用的插入方法。所以,这里我们需要改写一下插入方法:

  1. data = { 
  2.     'id''20120001'
  3.     'name''Bob'
  4.     'age': 20 
  5. table = 'students' 
  6. keys = ', '.join(data.keys()) 
  7. values = ', '.join(['%s'] * len(data)) 
  8. sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values
12

鲜花

握手

雷人

路过

鸡蛋
最新图文推荐
  • 2
  • 3
发表评论

最新评论

图文推荐
热门排行
现在注册,免费体验多款产品