数据库与python的结合
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
1、在python中连接数据库
先在terminal中进入mysql,用命令建立FATE库
# MariaDB [(none)]> CREATE DATABASE FATE;
# Query OK, 1 row affected (0.00 sec)
# ##### 再在python中操作,连接该库
# import pymysql
#
# con = pymysql.connect(host='localhost',
# user='root', #用root用户身份
# password='westos', #密码为westos
# db='FATE', #连接FATE库
# charset = 'utf8', #使语言都能正常显示、无乱码
# autocommit='True' #将执行结果提交
# )
2、创建游标对象
游标对象:cursor就是一个Cursor对象,这个cursor是一个实现了迭代器(def__iter__())和生成器(yield)的MySQLdb对象
# cur = con.cursor()
3、对数据库进行操作
(1)创建表(tables)
# try:
# create_tables='CREATE TABLE abc (id int,username varchar(20));' #将想对数据库进行的操作赋值给变量
# print(cur.execute(create_tables)) #用cur.execute()操作该变量,打印结果,此时打印结果的值为一个数字,意为该操作找了多少条数据库的信息
# except Exception as a: #若不能成功添加
# print('创建失败,失败原因:',a) #打印提示
# else: #若成功添加
# print('创建成功') #打印提示
#### 在python中运行的结果
# #0 #影响了0条数据库的信息
# #创建成功
#### 在数据库中查询到的结果
# # MariaDB [FATE]> SHOW TABLES; #查看表是否成功建立
# # +----------------+
# # | Tables_in_FATE |
# # +----------------+
# # | abc |
# # +----------------+
# # 1 row in set (0.00 sec) #显示表成功建立
(2)插入数据
# try:
# insert_table="INSERT INTO abc VALUES(3,'user1');"
# cur.execute(insert_table)
# except Exception as a:
# print("插入失败,原因为:",a)
# else:
# #con.commit() #该行意为将执行的操作提交,与连接数据库时的指令同义,提交前先将程序测试以下,若测试运行成功,再提交比较妥贴.
# print("插入成功")
#### 在python中运行的结果
# #插入成功
#### 在数据库中查询到的结果
# # MariaDB [FATE]> SELECT * FROM abc;
# # +------+----------+
# # | id | username |
# # +------+----------+
# # | 3 | user1 |
# # +------+----------+
# # 1 row in set (0.00 sec) #显示插入信息成功
(3)插入多条数据
# try:
# info = [(i,i) for i in range (30,40)]
# ##第一种方式
# # insert_A="INSERT INTO abc VALUES(%d,'%s');"
# # for x in info:
# # #print(insert_A %x) #插入前打印测试是否成功
# # cur.execute(insert_A %x) #测试完成后插入
# ##第二种方式
# # insert_B="INSERT INTO abc VALUES('%s','%s');"
# # cur.executemany(insert_B,info)
# except Exception as a:
# print("插入多条数据失败,原因为:",a)
# else:
# print("插入多条数据成功")
#### 在python中运行的结果
# #插入多条数据成功
#### 在数据库中查询到的结果
# # MariaDB [FATE]> SELECT * FROM abc;
# # +------+----------+
# # | id | username |
# # +------+----------+
# # | 3 | user1 |
# # | 10 | 10 |
# # | 11 | 11 |
# # | 12 | 12 |
# # | 13 | 13 |
# # | 14 | 14 |
# # | 15 | 15 |
# # | 16 | 16 |
# # | 17 | 17 |
# # | 18 | 18 |
# # | 19 | 19 | #可看到,插入多条数据成功
4、数据库的游标指针的操作
# import pymysql
#
# con = pymysql.connect(host='localhost',
# user='root',
# password='westos',
# db='FATE',
# charset = 'utf8',
# autocommit='True'
# )
# cur = con.cursor()
(1)数据库的查询
# select="SELECT USERNAME FROM abc;"
#
# print(cur.execute(select))
#
# #31 #该值为数据的条数,默认不返回查询结果集,只返回数据记录数
#
# print(cur.fetchone())
#
# #('user1',) #返回的结果是下一个查询结果集,以元组的格式返回
(2)游标指针的意义
# select = "SELECT * FROM abc;"
# cur.execute(select)
# print(cur.fetchone()) #查看下一个查询结果集
# #(3, 'user1')
# print(cur.fetchone()) #查看下一个查询结果集(此时游标指针移动了一格,所以查询结果不同了)
# #(10, '10')
# print(cur.fetchmany(3)) #查看当前位置的下N个查询结果集,N可任意
# #((11, '11'), (12, '12'), (13, '13'))
# print(cur.fetchall()) #查看当前位置开始的剩下所有的查询结果集
# #((14, '14'), (15, '15'), (16, '16'), (17, '17'), (18, '18'), (19, ....(以下省略)
(3)游标指针的移动
relative模式为将指针移动至相对位置,即在当前位置的基础上进行移动,若为负数即是向之前的位置移动,若为正数即为向之后的位置移动。
absolute模式为将指针移动至绝对位置,即无视指针当前位置,仅看数字代表的位置在何处,并将指针移动至数字代表的位置。
# 可以通过cursor.scroll(position,mode="relative/absolute")
# select = "SELECT * FROM abc;"
# cur.execute(select)
# print(cur.fetchmany(5))
# print('移动指针ing')
# cur.scroll(0,'absolute') #以absolute的模式,将指针移动到绝对位置(比如0就是开头)
# print(cur.fetchmany(2))
#
# # ((3, 'user1'), (10, '10'), (11, '11'), (12, '12'), (13, '13'))
# # 移动指针ing
# # ((3, 'user1'), (10, '10'))
#
# cur.scroll(2,'absolute') #以absolute的模式,将指针移动到2的位置
# print(cur.fetchmany(2))
#
# #((11, '11'), (12, '12'))
#
# cur.scroll(-4,mode='relative') #以relative的模式,将指针移动到相对位置,相对于原位置的前4个位置
# print(cur.fetchmany(4))
#
# #((3, 'user1'), (10, '10'), (11, '11'), (12, '12'))