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. cunda 常用命令,删除,创建,换源

    https://github.com/tensorflow/tensorflow/ conda create --name [虚拟环境名] python=3.7 创建一个环境 conda activa ...

  2. vs2010中release模式下调试程序

    debug模式调试信息全,但是速度很慢,在数据量比较大的时候非常影响调试效率,release模式速度快,但是没有调试信息.所以在编译的时候很多编译器会提供一种折中的编译方式,在release下提供调试 ...

  3. C/C++中浮点数输出精度的问题

    本文使用C++语言书写,对于C的小伙伴们,如果编译不通过的话--就说明C里面没有这个内容,可以跳过 通常来说,我们书写程序主要只用整形变量 (signed/unsigned) (long/long l ...

  4. SkyWalking配上告警更优秀

    前言 对于监控系统来说,不可能让人一直盯着监控看板,而更多的是以自动提醒的方式,比如邮件.短信或微信推送等,当达到或超出预设的告警指标时,就自动发送消息提醒,下面就来说说如何配置SkyWalking的 ...

  5. i love dingning

    "如果你爱一个人,不是下课给人家买买水,不是短信发来发去,也不是周末一起出来唱唱歌聊聊天吃吃饭,而是做一个出色的人.以后的以后,可能还有别的人爱她,你要做的,是把别人都比下去.你要变得优秀, ...

  6. spring mvc 原理(快速理解篇)

    这两张图大家应该都不陌生. 从图上来看就是:一个请求过来,front controller根据具体的请求路径分派到具体的controller,具体的controller处理请求并把处理结果返回给fro ...

  7. Loto实践干货(8)loto示波器在LED台灯调光问题维修中的应用案例

    Loto实践干货(8)loto示波器在LED台灯调光问题维修中的应用案例 一位客户最近觉得觉得他的LED台灯好闪, 于是拆了看看,里面的控制板是这样的: 干掉双色调光功能,只调亮度的话闪烁的状况能好转 ...

  8. MongoDB 集群 config server 查询超时导致 mongos 集群写入失败

    环境 OS:CentOS 7.x DB:MongoDB 3.6.12 集群模式:mongod-shard1 *3 + mongod-shard2 *3 + mongod-conf-shard *3 + ...

  9. loadrunner12自带的机票预订服务,解决httpd: Could not reliably determine the server's fully qualified domain name 问题

    遇到以上问题是在启动loadrunner12自带的机票预订服务器情况下遇到的,错误提示如下图: 解决方案: 编辑httpd.conf 文件,加入一句 ServerName localhost:1080 ...

  10. SpringCloud升级之路2020.0.x版-32. 改进负载均衡算法

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在前面一节,我们梳理了实现 Feign 断路器以及线程隔离的思路,这一节,我们先不看如何源 ...