connect 模块下载

https://dev.mysql.com/downloads/connector/python/

import mysql.connector
con = mysql.connector.connect(
host = "192.168.111.153",
port = "3306",
user = "quan",
password = "2004",
database = "mon"
) con.close()

import mysql.connector
config = {
"host":"192.168.111.153",
"port":3306,
"user":"quan",
"password":"2004",
"database":"mon"
} con = mysql.connector.connect(**config)

import mysql.connector
config = {
"host":"192.168.111.153",
"port":3306,
"user":"quan",
"password":"2004",
"database":"mon"
} con = mysql.connector.connect(**config) cursor = con.cursor()
sql = "SELECT id,classname FROM class;"
cursor.execute(sql)
for one in cursor:
print(type(one))
print(one[0],one[1]) sql2 = "SHOW TABLES"
cursor.execute(sql2)
for i in cursor:
print(i) 结果;
<class 'tuple'>
1 dada
<class 'tuple'>
2 jave
<class 'tuple'>
4 py
('ALT',)
('class',)
('class_type',)
('fa',)
('father',)
('joson',)
('nu',)
('numm',)
('nummm',)
('provices',)
('qqq',)
('son',)
('ss',)
('tp3',)
('tp4',)
('tp5',)
('tp6',)
('user',)

实现sql注入;

SQL Injection:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。 

具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

防止:

1.永远不要信任用户的输入,要对用户的输入进行校验,可以通过正则表达式,或限制长度,对单引号和双"-"进行转换等。 

2.永远不要使用动态拼装SQL,可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。 

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。 

4.不要把机密信息明文存放,请加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装,把异常信息存放在独立的表中。
import mysql.connector
config = {
"host":"192.168.111.153",
"port":3306,
"user":"quan",
"password":"2004",
"database":"mon"
}
con = mysql.connector.connect(**config)
ID = "1 OR 1 = 1"
CN = "1 OR 1 = 1"
sql = "SELECT COUNT(*) FROM class WHERE id ="+ID+" AND classname = "+CN;
cursor = con.cursor()
cursor.execute(sql)
print(cursor.fetchone()[0])
con.close() 结果:
3

编译成二进制还不能执行,需要传入参数
传入参数之后二进制再进行执行,提高效率,不需要再分析磁盘这些步骤

输入的所有参数都是认为是字符串处理,不在分析,

import mysql.connector
config = {
"host":"192.168.111.153",
"port":3306,
"user":"quan",
"password":"2004",
"database":"mon"
}
con = mysql.connector.connect(**config)
ID = "1 OR 1 = 1"
CN = "1 OR 1 = 1"
sql = "SELECT COUNT(*) FROM class WHERE id =%s AND classname = %s ";
cursor = con.cursor()
cursor.execute(sql,(ID,CN))#这里并没有给sql直接传入参数,而是让sql先编译成二进制再传入参数
print(cursor.fetchone()[0])
con.close() 结果:
0

con.commit()用于提交事务,connector不会为你自己提交
con.rollback()回滚事务

con in dir()判断con变量是否创建
import  mysql.connector

try:
con = mysql.connector.connect(
host="192.168.111.153",
port="3306",
user="quan",
password="2004",
database="mon"
)
con.start_transaction()#开启事务
cursor = con.cursor()#创建游标
sql = "INSERT INTO class(classname) VALUES (%s)"
cursor.execute(sql,("QQQQ",)) con.commit()
except Exception as e:
if "con" in dir():
con.rollback()
print(e)
finally:
if "con" in dir():
con.close()

结果:

import  mysql.connector

try:
con = mysql.connector.connect(
host="192.168.111.153",
port="3306",
user="quan",
password="2004",
database="mon"
)
con.start_transaction()#开启事务
cursor = con.cursor()#创建游标
sql = "DELETE FROM class WHERE id = %s"
cursor.execute(sql,(9,)) con.commit()
except Exception as e:
if "con" in dir():
con.rollback()
print(e)
finally:
if "con" in dir():
con.close()

import mysql.connector.pooling

config = {
"host":"192.168.111.153",
"port":"3306",
"user":"quan",
"password":"2004",
"database":"mon"
}
try:
pool = mysql.connector.pooling.MySQLConnectionPool(
**config,
pool_size = 10
)
#因为连接池里面的连接不需要关闭,所以这里不用使用finaly
con = pool.get_connection()
con.start_transaction()
cursor = con.cursor()
sql = "UPDATE class SET classname = %s WHERE id = %s"
cursor.execute(sql,("javagai",2))
con.commit()
except Exception as e:
if "con" in dir():
con.rollback()
print(e)

import mysql.connector.pooling

config = {
"host":"192.168.111.153",
"port":3306,
"user":"quan",
"password":"2004",
"database":"mon"
}
try:
pool = mysql.connector.pooling.MySQLConnectionPool(
**config,
pool_size = 10
)
con = pool.get_connection()
con.start_transaction() cursor = con.cursor()
sql = "DELETE class,user FROM class LEFT JOIN user ON class.id = user.cid "
cursor.execute(sql) con.commit() except Exception as e:
if "con" in dir():
con.rollback()
print(e)

结果:

import mysql.connector.pooling

config = {
"host":"192.168.111.153",
"port":3306,
"user":"quan",
"password":"2004",
"database":"mon"
}
try:
pool = mysql.connector.pooling.MySQLConnectionPool(
**config,
pool_size=10
)
con = pool.get_connection()
con.start_transaction()
cursor = con.cursor()
sql = "INSERT INTO class VALUES (%s ,%s)"
sql_list = [[1,"QQQ"],[2,"ZZZ"],[3,"QQQ"]]
cursor.executemany(sql,sql_list) con.commit() except Exception as e:
if "con" in dir():
con.rollback()
print(e)

结果;

 
实践111111111111111
将class_type表里面pid大于平均pid的信息导入到class_type_new里面,并将信息里面的name改为END

import mysql.connector.pooling

config = {
"host":"192.168.111.153",
"port":3306,
"user":"quan",
"password":"2004",
"database":"mon"
}
try:
pool = mysql.connector.pooling.MySQLConnectionPool(
**config,
pool_size=10
)
con = pool.get_connection()
con.start_transaction() cursor = con.cursor()
sql = "DROP TABLE class_type_new"
cursor.execute(sql)
#创建的新表
sql = "CREATE TABLE class_type_new LIKE class_type"
cursor.execute(sql)
#获取平均id
sql = "SELECT AVG(pid) AS avg FROM class_type"
cursor.execute(sql)
temp = cursor.fetchone()
avg = temp[0]#平均id保存到变量
#查找大于平均id的id
sql = "SELECT id FROM class_type WHERE pid >=%s "
cursor.execute(sql,(avg,))
temp1 = cursor.fetchall()#结果保留到变量[(5,), (6,), (7,), (8,), (9,), (10,)]
#将原来表里面符合平均id的复制到新表
do_id = ""
for num in range(len(temp1)):
id = str(temp1[num][0])
if num != len(temp1) - 1:
id = id + ","
do_id += id
sql = "INSERT INTO class_type_new SELECT * FROM class_type WHERE id IN (" + do_id +")"
cursor.execute(sql)
#将原来的表删除
sql = "DELETE FROM class_type WHERE id IN (" + do_id + ")"
cursor.execute(sql)
#将软来的name改为END
sql = "UPDATE class_type_new SET name = %s"
cursor.execute(sql,("END",))
con.commit()
except Exception as e:
if "con" in dir():
con.rollback()
print(e)

结果:

实践22222222
往class_type_new里面加入两组数据,其中 id 为最大id+10

不能再本表查询结果作为本表插入数据

import mysql.connector.pooling

config = {
"host":"192.168.111.153",
"port":3306,
"user":"quan",
"password":"2004",
"database":"mon"
} try:
pool = mysql.connector.pooling.MySQLConnectionPool(
**config,
pool_size=10
)
con = pool.get_connection()
con.start_transaction()
sql = "INSERT INTO class_type_new (" \
"SELECT MAX(id) + 10,%s,%s FROM class_type_new) UNION " \
"(SELECT MAX(id) + 20,%s,%s FROM class_type_new)"
cursor = con.cursor()
cursor.execute(sql,("DD",8,"EE",9))
con.commit() except Exception as e:
if "con" in dir():
con.rollback()
print(e)

结果:

python19 操作mysql的更多相关文章

  1. ASP.NET Core 1.0 使用 Dapper 操作 MySql(包含事务)

    操作 MySql 数据库使用MySql.Data程序包(MySql 开发,其他第三方可能会有些问题). project.json 代码: { "version": "1. ...

  2. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy

    本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...

  3. EF操作MySql

    EF的CodeFrist操作MySql的提前准备: 1.安装两个包:MySql.Data和MySql.Data.Entity,在VS中程序包管理器中添加2个包.(备注需要的VS2015,并且EF6支持 ...

  4. .NET Core 使用Dapper 操作MySQL

    MySQL官方驱动:http://www.cnblogs.com/linezero/p/5806814.html .NET Core 使用Dapper 操作MySQL 数据库, .NET Core 使 ...

  5. asp.net core 1.1 升级后,操作mysql出错的解决办法。

    遇到问题 core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新.插入操作没有问题. 如果你也遇到这个问题,请参照以下步骤进行升 ...

  6. 练习:python 操作Mysql 实现登录验证 用户权限管理

    python 操作Mysql 实现登录验证 用户权限管理

  7. Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  8. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  9. java分享第十七天-03(封装操作mysql类)

     JAVA操作mysql所需jar包:mysql-connector-java.jar代码: import java.sql.*; import java.util.ArrayList; import ...

随机推荐

  1. 四万字32图,Kafka知识体系保姆级教程宝典

    本文目录: 一.消息队列 Apache Pulsar Pulsar 与 Kafka 对比 二.Kafka基础 三.Kafka架构及组件 四.Kafka集群操作 五.Kafka的JavaAPI操作 六. ...

  2. the Agiles Scrum Meeting 10

    会议时间:2020.4.18 20:00 1.每个人的工作 今天已完成的工作 个人结对项目增量开发组:完成自动创建仓库功能 issues:增量组:准备评测机制,增加仓库自动创建和管理 团队项目增量开发 ...

  3. Vue el 使用el-checkbox-group复选框进行单选框操作

    el-checkbox-group这个组件与其他复选框不一样,我当初也是半天不知道怎么操作 页面使用v-model绑定 size就是等比例缩小放大,v-ror循环应该看的懂.重要的是@chage到我们 ...

  4. logstash的安装和简单使用

    logstash的安装和简单使用 一.安装 1.下载并解压 2.logstash 一些命令行参数 1.查看帮助信息 2.加载指定pipeline文件路径 3.检测配置文件语法是否有错误 4.热加载pi ...

  5. spring security中ajax超时处理

    spring security为我们的系统提供了方便的认证和授权操作.在系统中完成认证和授权后,一般页面页面上大多数是ajax和后台进行操作,那么这个时候可能就会面临session超时,ajax去访问 ...

  6. 联赛膜你测试20 T1 Simple 题解 && NOIP2017 小凯的疑惑 题解(赛瓦维斯特定理)

    前言: 数学题,对于我这种菜B还是需要多磨啊 Simple 首先它问不是好数的数量,可以转化为用总数量减去是好数的数量. 求"好数"的数量: 由裴蜀定理得,如果某个数\(i\)不能 ...

  7. qgis cookbook-QgsMapRendererJob学习

    学习到渲染(QgsMapRendererJob),按照教程所讲总是输出不了图像,看了一下qgis的测试源码,发现少了一句话,加上后就可以输出了! from qgis.core import * fro ...

  8. 零基础入门之Linux进程基础

    计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等.这些最基础的计算机动作被称为指令(instruction).所谓的程序(program),就是这样一系列指 ...

  9. linux中的strip命令简介

    转载:https://blog.csdn.net/qq_37858386/article/details/78559490 strip:去除,剥去     一.下面是man strip获得到的信息,简 ...

  10. 最新JS正则表达式验证手机号码(2019)

    根据移动.联通.电信的电话号码号段,实现一个简单的正则表达式来验证手机号码: // 手机号校验 export function isPhoneNumber(phoneNum) { // let reg ...