MySQL与Python交互

拆表

将分组结果插入另一张表里

insert into goods_cates (name) select cate_name from goods group by cate_name; # 注意,不用加values

同步数据表,把一张表字段覆盖到另一张表上

update goods as g inner join goods_cates as c on g.cate_name = c.name set g.cate_name = c.id;

改字段的类型 change

创建外键

alter table goods add foreign Key (cate_id) references goods_cates(id);

删掉外键

alter table goods drop foreign Key 外键名; # 外键名可以通过语句"show create table good;"查询

 


from pymysql import *

def main():
    # 创建Connection连接
    connc = connect(host="localhost", port=3306, user="root", password="root", database="python02", charset="utf8")
    # 获得Cursor对象
    csl = connc.cursor() # csl相当于游标,查询结果保存在里面,每执行一次csl.fetchone()会自动指向下一行数据。csl.fetchmany(x),x接受参数;csl.fetchall()返回所有数据,格式为一个元组嵌套另一个元组;# 执行select语句,并返回受影响的行数:查询一条数据  count = csl.execute('SELECT id, name FROM students2 WHERE gender = 2') 
  # 打印受影响的行数
  
print("查询到%d条数据" % count)

  for i in range(count):
    
# 获取当前的结果
    result = csl.fetchone()
    
# 打印查询的结果
    print(result)

  # 关闭Cursor对象
  csl.close()
  connc.close()

if __name__ == "__main__": main()

 增删改这三个需要修改数据库的地方,在操作完,关闭连接之前,需要加上

conn.commit()

撤销刚才的操作,在commit()之前,运行

conn.rollback()

 


防止MySQL的注入

注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符

根本原理:就根据程序的字符串拼接name='%s',我们输入一个xxx' -- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

最后那一个空格,在一条sql语句中如果遇到select * from t1 where id > 3 -- and name='egon';则--之后的条件被注释掉了

#1、sql注入之:用户存在,绕过密码
egon' -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符
# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name='%s' and password='%s'" %(user,pwd)
# print(sql)
# res=cursor.execute(sql)

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
res=cursor.execute(sql,[user,pwd]) #pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

 

posted @ 2018-11-19 17:24  心灵蚂蚁  阅读(205)  评论(0编辑  收藏  举报