python之myslq操作
1 # ①如果将D:\Python27\Scripts目录添加到path中,可以直接在whl文件所在目录用管理员打开一个cmd窗口,直接执行下面的语句。 2 3 # pip install PyMySQL-0.9.0-py2.py3-none-any.whl 4 5 # ②否则的话,需要在D:\Python27\Scripts目录下用管理员打开cmd,运行pip命令,文件名应该写全路径) 6 7 # pip install D:\software\PyMySQL-0.9.0-py2.py3-none-any.whl 8 9 # 数据库操作流程 10 # 连接数据库→创建游标→执行SQL→fetch获得数据,进行业务处理→关闭游标→commit→关闭数据库连接 11 """ 12 create : 2018-06-30 13 @author : Sun 14 ps:3.6版后不支持mysqldb了,只能用pymysql来代替,当用法差不多 15 """ 16 # !/usr/bin/env python 17 # coding = utf-8 18 19 # 导入pymysql得包 20 21 import pymysql 22 # 连接数据库 23 db_conn = pymysql.connect(host='localhost', 24 user='root', 25 password='123456', 26 db='python', 27 port=3306, 28 charset='utf8') # 初始出现编码错误,需要将utf-8改成utf8才行 29 # 创建游标 30 cur = db_conn.cursor() # 游标就相当于文件操作中的句柄 31 # ***** 在创建游标时可以指定返回的数据类型 32 # cur = db_conn.cursor(cursor=pymysql.cursors.DictCursor) # 设置查询结果为字典格式 33 # 执行sql语句 34 sql = 'show tables' 35 cur.execute(sql) 36 # # 获取数据 37 data = cur.fetchone() # data是一个生成器,每次获取一条信息。每一行返回的是一个元组 ('answer',) 38 print(data) 39 data1 = cur.fetchall() # 接收全部得返回结果行 (('data_test_temp',), ('test_name',), ('user_name',)) 40 data2 = cur.fetchmany(3) # 括号里写的是数字,写的几行就返回几行,不写就返回空即一个空元组() 41 # 注意下面: 42 select_data = cur.execute('select * from answer') 43 print(select_data) # 返回的是4,表示select_data 返回的并不是显示查询的内容而是影响数据的行数,4表示answer表中只有4行数据 44 45 # ----------数据库MySQL基本操作----------- 46 # 查询数据库的基础参数信息:如数据库版本、数据库状态、库进程队列,数据库里有多少个库,切换库,当前用的库,当前用户等 47 ''' 48 sql语句为: 49 select verson(); show status; show processlist; show databases; use db_name; select database(); select user(); 50 show tables; 51 ''' 52 sql_mdl = 'select version()' 53 cur.execute(sql_mdl) # 使用execute()方法 执行sql语句 54 data_mesg = cur.fetchone() # 使用fetchone() 方法拿到单条信息 55 print("数据库的版本是:%s" % data_mesg) 56 # 创建库 57 ''' 58 sql语句为:create database db_name ; 59 ''' 60 # create_db_sql = 'drop database mysqldb' # 暂时没发现可以两条语句一起执行的方法,待续 61 # cur.execute(create_db_sql) 62 cur.execute('show databases'); 63 print(cur.fetchall()) # 查看一下是否创建成功,无需db_connect.commit(),自会创建成功 64 # 删库 65 ''' 66 sql语句为:drop database db_name ; 67 ''' 68 # drop_db_sql = 'drop database linux_db' 69 # cur.execute(drop_db_sql) 70 71 # ----------数据库MySQL对表结构的操作----------- 72 # 创建表 73 ''' 74 sql语句为:create table table_name (column1 data_type, column2 data_type,......); 75 注:判断表是否存在如果存在就删掉:drop table if exists table_name; 76 ''' 77 # create_table_sql = 'create table study_mysql(id int(10) unsigned not null,name CHAR(10),age INT(4))' 78 # cur.execute(create_table_sql) 79 # cur.execute("show tables"); print(cur.fetchall()) 80 81 # 删除表 82 ''' 83 sql语句为:drop table table_name; 84 ''' 85 # table_drop_sql = 'drop table data_test_temp' 86 # cur.execute(table_drop_sql) 87 # 列的操作:增删改查列名及数据类型 88 ''' 89 sql语句为: 90 增: alter table table_name add new_column after column; (after 语句可省,默认加在最后) 91 ''' 92 # column_add_sql = 'alter table test_name add edit_time CHAR (20) after age' 93 # cur.execute(column_add_sql) 94 ''' 95 sql语句为: 96 删: alter table table_name drop column; 97 ''' 98 # column_drop_sql = 'alter table test_name drop ps_new' 99 # cur.execute(column_drop_sql) 100 ''' 101 sql语句为: 102 改: alter table table_name change old_column new_column data_type; 103 ''' 104 # column_change_sql = 'alter table test_name change edit_time xxxx CHAR (33)' 105 # cur.execute(column_change_sql) 106 ''' 107 sql语句为: 108 查: desc table_name; 109 ''' 110 column_select_sql = 'desc test_name' 111 cur.execute(column_select_sql) 112 print(cur.fetchall()) 113 # ----------数据库MySQL对表数据的操作----------- 114 ''' 115 sql语句为: 116 增: insert into table_name (column,column2.....)values(value1,value2.....); 117 ''' 118 # insert_data = 'insert into answer VALUES (01,100,"python_develop001")' # 注意数据类型非数字的要加引号 119 # cur.execute(insert_data) 120 # # 批量加 (和字符串格式化知识一起用) 121 # li = [ 122 # (5, 100, "it"), 123 # (6, 99, "driver"), 124 # (7, 98, "car") 125 # ] # 因为查询返回默认都是以元组格式返回,故列表中存储为元组 126 # try: 127 # # 执行sql语句 128 # cur.executemany("insert into answer VALUES (%s,%s,%s)", li) # ******注意!!!! 129 # # 提交到数据库执行 130 # db_conn.commit() # 向表中插入数据需要提交保存,不能像修改表结构数据一样不加commit 131 # except: 132 # # 发生错误时回滚 133 # db_conn.rollback() 134 ''' 135 sql语句为: 136 删: delete from table_name where column = value; 137 删除表中所有数据:delete from table_name; 138 ''' 139 # delete_data = 'delete from answer where ques_id = "1" ' # ques_id 为字符串 140 # cur.execute(delete_data) 141 # db_conn.commit() 142 # # 数据库操作完毕,关闭游标 143 # cur.close() 144 ''' 145 sql语句为: 146 改: update table_name set column = new_data where column = value; 147 ''' 148 # update_data = "update answer set score = 200 where ques_id ='5'" 149 # cur.execute(update_data) 150 # db_conn.commit() 151 ''' 152 sql语句为: 153 查: select column/* from table_name where column = value; 154 ''' 155 # ***** 在创建游标时可以指定返回的数据类型 156 # cur = db_conn.cursor(cursor=pymysql.cursors.DictCursor) # 设置查询结果为字典格式 157 158 select_data1 = 'select * from answer where python_job = "%s" ' % ("it") # 注意格式化写法 表名、类名不要加引号,记录值需要加引号。经过测试还发现,当记录值为字符串时需要加引号,记录值为数字时,不用加引号。 159 try: 160 cur.execute(select_data1) 161 for i in cur.fetchall(): 162 ques_id = i[0] 163 score = i[1] 164 python_job = i[2] 165 print("{},{},{}".format(ques_id, score, python_job)) 166 except: 167 print("Error: unable to fetch db") 168 169 # 提交、保存对数据库修改的数据 (如仅仅查询,可以不用,但如果修改了数据库内容,必须做) 170 # db_conn.commit() 171 172 # 关闭数据库连接 173 db_conn.close() 174 175 print(select_data) # 断开连接还可以查询说明数据都在内存中了
经典微博:https://blog.csdn.net/Zhihua_W/article/details/54313258
女神:https://www.cnblogs.com/Eva-J/p/5133716.html
菜鸟:http://www.runoob.com/python/python-mysql.html
举例:
name="I'mHere"
注意: cursor.execute()可以接受一个参数,也可以接受两个参数:
(1) cur.execute("insert into resource(cid,name) values(%s, %s)" , (12,name) );
这种格式是接受两个参数,MySQLdb会自动替你对字符串进行转义和加引号,不必再自己进行转义,执行完此语句之后,resource表中多了一条记录: 12 I'mHere
(2) cur.execute("insert into resource(cid,name) values(%s, %s)" % (12,name) );
这种格式是利用python的字符串格式化自己生成一个query,也就是传给execute一个参数,此时必须自己对字符串转义和增加引号,即上边的语句是错误的,应该修改为:
name = MySQLdb.escape_string(name);
cursor.execute("insert into resource(cid,name) values('%s', '%s')" % (12,name) );
这样插入的记录才和(1)一样:12 I'mHere
即单独写成sql语句传给execute函数应该如下:
sql = "insert into resource(cid,name) values('%s', '%s')" % (12,name)
查询like语句:
原生: update userinfo set password = ‘123456’ where name like %sun%;
pymysql:
sql = "update userinfo set password = %s where name like %s "
args = ('123456', '%sun%')
ret = cur.execute(sql,args)