python之myslq操作

  1 # ①如果将D:Python27Scripts目录添加到path中,可以直接在whl文件所在目录用管理员打开一个cmd窗口,直接执行下面的语句。
  2 
  3 # pip install PyMySQL-0.9.0-py2.py3-none-any.whl
  4 
  5 # ②否则的话,需要在D:Python27Scripts目录下用管理员打开cmd,运行pip命令,文件名应该写全路径)
  6 
  7 # pip install D:softwarePyMySQL-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)

原文地址:https://www.cnblogs.com/sunxiuwen/p/9248221.html