爬虫与Python:(四)爬虫进阶二之数据存储(数据库存储)——8.PostgreSQL存储
安装PostgreSQL数据库方法详见:https://www.cnblogs.com/luyj00436/p/15525370.html。
安装库
Psycopg是Python编程语言中最流行的PostgreSQL数据库适配器,其主要功能是完整实现Python DB API 2.0规范和线程安全(多个线程可以共享相同的链接)。它专为大量多线程应用程序而设计,可以创建和销毁大量游标,并创建大量并发“INSERT”或“UPDATE”。
Psycopg 2 主要在C语言中作为libpq包装实现,既高效又安全,它具有客户端和服务端游标,异步通信通知,“复制到/复制”支持。许多Python类型都支持开箱即用,适用匹配PostgreSQL数据类型,通过灵活的物体适应系统,可以扩展和定制适应性。Psycopg 2 兼容Unicode和Python 3。
在学习之前先安装Psycopg 2库,可以使用pip命令进行安装。
pip install psycopg2
在确保已经有一个可以连接的PostgreSQL 数据的情况下,进行接下来的学习和操作。下面是获取pg数据连接的示例。
1 import psycopg2 2 3 # 创建PostgreSQL数据库连接对象 4 conn = psycopg2.connect( 5 database="postgres", 6 user="postgres", 7 password="123456", 8 host="localhost", 9 port="5432" 10 ) 11 12 cur = conn.cursor() # 创建执行对象
通过cursor()方法拿到了指针对象,有了这个就可以用它执行sql语句。这与之前讲到的MySQL 操作类似。
1. 插入数据
插入数据时,只需要用户将插入的sql语句写好,然后使用cur执行操作对象execute()方法即可完成sql的执行,示例代码如下:
1 import psycopg2 2 3 # 创建PostgreSQL数据库连接对象 4 conn = psycopg2.connect( 5 database="postgres", 6 user="postgres", 7 password="123456", 8 host="localhost", 9 port="5432" 10 ) 11 cur = conn.cursor() # 创建执行对象 12 13 # 创建表 14 cur.execute("CREATE TABLE student(id integer,name varchar ,sex varchar);") 15 # 插入数据 16 cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(1,'Aspirin','M')) 17 cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(2,'Taxol','F')) 18 cur.execute("INSERT INTO student(id,name,sex) VALUES(%s,%s,%s)",(3,'Dixheral','M')) 19 20 # 关闭连接 21 conn.commit() 22 cur.close() 23 conn.close()
2. 查询数据
查询数据时,可以在执行完sql语句后,调用cur的fetchall()方法获取结果。示例代码如下:
cur.execute('SELECT * FROM student') result = cur.fetchall()
3. 修改和删除数据
修改与删除数据与插入类似,唯一不同的就是sql语句,示例代码如下:
1 import psycopg2 2 3 # 创建PostgreSQL数据库连接对象 4 conn = psycopg2.connect( 5 database="postgres", 6 user="postgres", 7 password="123456", 8 host="localhost", 9 port="5432" 10 ) 11 cur = conn.cursor() # 创建执行对象 12 13 # 修改数据 14 cur.execute("UPDATE student set name='TiMi',sex='M' WHERE id=2") 15 # # 删除数据 16 cur.execute("DELETE from student WHERE id=3;") 17 18 # 关闭连接 19 conn.commit() 20 print(cur.rowcount ,"条记录被修改") 21 cur.close() 22 conn.close()
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。