python操作mysql,,python操作my


python操作mysql

一、基本操作

导入pymysql模块建立数据库连接对象conn通过conn创建操作sql的游标对象编写sql交给cursor执行如果是查询,通过cursor对象,获取结果操作完毕,端口操作与连接
1)#导入pymysql模块import pymysql2)#建立数据库连接对象connconn = pymysql.connect(user = 'root',password = '12345678',database = 'yjy')  #此处还可以写autocommit=True,待会可以自动提交事务3)#通过conn创建操作sql的游标对象cursor = conn.cursor(pymysql.cursors.DictCursor)# 注:游标不设置参数,查询的结果就是数据元组,数据没有标识性# 设置pymysql.cursors.DictCursor,查询的结果是字典,key是表的字段4)#编写sql交给cursor执行# #先创建一个表sql1 = 'create table tt(id int primary key auto_increment ,x int ,y int);'cursor.execute(sql1)mysql> desc tt;+-------+---------+------+-----+---------+----------------+| Field | Type    | Null | Key | Default | Extra          |+-------+---------+------+-----+---------+----------------+| id    | int(11) | NO   | PRI | NULL    | auto_increment || x     | int(11) | YES  |     | NULL    |                || y     | int(11) | YES  |     | NULL    |                |+-------+---------+------+-----+---------+----------------+#插入数据# sql2 = 'insert into tt values(%s, %s, %s)'sql2 = 'insert into tt(x,y) values(%s, %s)'cursor.execute(sql2,(1,10))cursor.execute(sql2,(2,20))cursor.execute(sql2,(3,30))conn.commit() #在建立对象conn时不设置autocommit=True时,必须要提交事务,不然的话写不到数据库mysql> select * from tt;+----+------+------+| id | x    | y    |+----+------+------+|  1 |    1 |   10 ||  2 |    2 |   20 ||  3 |    3 |   30 |+----+------+------+'''还可以插入多条数据'''cursor.executemany(sql2,[(4,40),(5,50),(6,60)])  #这里是executemany,而且一定要记住中括号conn.commit()+----+------+------+| id | x    | y    |+----+------+------+|  1 |    1 |   10 ||  2 |    2 |   20 ||  3 |    3 |   30 ||  4 |    4 |   40 ||  5 |    5 |   50 ||  6 |    6 |   60 |+----+------+------+'''删'''sql3= 'delete from tt where id = %s'cursor.executemany(sql3,(2,3,4,5))conn.commit()+----+------+------+| id | x    | y    |+----+------+------+|  1 |    1 |   10 ||  6 |    6 |   60 |+----+------+------+'''改'''sql4 = 'update tt set y=888 where id = 6'cursor.execute(sql4)conn.commit()+----+------+------+| id | x    | y    |+----+------+------+|  1 |    1 |   10 ||  6 |    6 |  888 |+----+------+------+'''查'''sql5 = 'select * from tt'res = cursor.execute(sql5)  print(res) #85)#如果是查询,通过cursor对象,获取结果r1 = cursor.fetchone()  #偏移一条数据取出  print(r1)  #{'id': 1, 'x': 1, 'y': 10}r2 = cursor.fetchmany(3)   #偏移3条数据取出print(r2)  #[{'id': 2, 'x': 2, 'y': 20}, {'id': 3, 'x': 3, 'y': 30}, {'id': 4, 'x': 4, 'y': 40}]r3 = cursor.fetchall()  #把偏移后剩余的全部取出来print(r3)#[{'id': 5, 'x': 5, 'y': 50}, {'id': 6, 'x': 6, 'y': 60}, {'id': 7, 'x': 7, 'y': 70}, {'id': 8, 'x': 8, 'y': 80}]6)#操作完毕,端口操作与连接cursor.close()  #关闭游标对象conn.close()   #关闭数据库连接对象

二、事务

import pymysqlconn = pymysql.connect(user = 'root',password = '12345678',database = 'yjy')cursor = conn.cursor(pymysql.cursors.DictCursor)#对表的重复创建做一个异常处理,防止报错try:    sql1 = 'create table ts(id int primary key auto_increment ,name char(8),money int)'    cursor.execute(sql1)except Exception:    print('表已经创建')    pass#在空表中插入数据row = cursor.execute('select * from ts')  #检查一下表里面是否有数据if not row:  #如果没有数据,插入数据    sql = 'insert into ts(name,money) values(%s,%s)'    res  = cursor.executemany(sql, [('yjy', 10), ('wwb', 30)])    conn.commit()#在事务中出现的失败,处理一下异常try:    sql1 = 'update ts set money=money-1 where name="yjy"'    r1 = cursor.execute(sql1)    sql2 = 'update ts set money=money+1 where name="wwb"'  # 转入的人不存在    r2 = cursor.execute(sql2)except:    print('转账执行异常')    conn.rollback()  #回滚else:    print('转账没有异常')    if r1 == 1 and r2 == 1:        print('转账成功')        conn.commit()  #提交事务    else:        conn.rollback()  #回滚        mysql> select * from ts;+----+------+-------+| id | name | money |+----+------+-------+|  1 | yjy  |    10 ||  2 | wwb  |    30 |+----+------+-------+2 rows in set (0.00 sec)mysql> select * from ts;+----+------+-------+| id | name | money |+----+------+-------+|  1 | yjy  |     9 ||  2 | wwb  |    31 |+----+------+-------+2 rows in set (0.00 sec)

三、sql注入

import pymysqlfrom pymysql.cursors import DictCursorconn = pymysql.connect(user='root', passwd='12345678', db='yjy')cursor = conn.cursor(DictCursor)try:    sql = 'create table user(id int primary key auto_increment, name char(4), password char(6))'    row = cursor.execute(sql)    print(row)except:    print('表已创建')    pass# 空表才插入row = cursor.execute('select * from user')if not row:    sql = 'insert into user(name,password) values(%s,%s)'    row = cursor.executemany(sql, [('yjy', '123'), ( 'wwb', 'abc')])    conn.commit()# 用户登录usr = input('usr: ')pwd = input('pwd: ')#数据库验证sql = 'select * from user where name=%s and password=%s'row = cursor.execute(sql, (usr, pwd))if row:    print('登录成功')else:    print('登录失败')# 自己拼接参数一定有sql注入,将数据的占位填充交给pymysql,下面这个方式是不正确的,对数据库中的数据不安全,用户随便用符号就可以登陆进去,所以,我们在上面的数据库验证得时候改了格式"""sql = 'select * from user where name="%s" and password="%s"' % (usr, pwd)row = cursor.execute(sql)if row:    print('登录成功')else:    print('登录失败')"""# 知道用户名时# 输入用户时:#   yjy" # => select * from user where name="yjy" #" and password="%s"# 不自定义用户名时#   " or 1=1 # => select * from user where name=" " or 1=1 #" and password="%s"(就不需要输入密码了)———————————————————————————————————————————————————————————————————————————————————usr: yjypwd: 123登录成功

四、索引

是添加给数据库表的字 的给表创建键后该表不仅会形成表结构、表数据,还有键的B+结构图(加速查找的一个图)键的结构图是需要维护的,在数据完成增、删、改操作时,只要影响到有键的字段,结构图都要维护一次创建键后一定会降低 增、删、改 的效键可以极大的加快查询速度(开发需求中,几乎业务都和查有关系)建立键的方式:主键、外键、唯一键、index
#上面这个没有什么好说的,意思就是,当我们数据达到几十万条,几千万条,用索引查找时间会更快,这就是给表创建键的好处。

python操作mysql

评论关闭