TOC

当我们在写程序中需要使用到数据库的时候,尽量在代码层次实现一些限制,例如两张表,我们不再使用外键去关联表与表之间的关系,我们可以在程序层面修改其中的一张表,再去修改另一张表的数据,这样会减轻数据库的压力,代码层次可以实现的,就不要再去使用数据库。

pymysql的语法

import pymysql  # 下载并导入pymysql模块

# 建立连接,并产生一个连接会话对象
conn = pymysql.connect(
user='root',
password='123',
host='127.0.0.1',
port=3306, # 注意:端口号不需要用引号引起来
charset='utf8',
database='db1'
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 产生一个游标对象
# cursor=pymysql.cursors.DictCursor 将查询出来的结果制作成字典的形式返回
# 若不加,则返回的是括号加数据,例如:(1, 张三),不会显示表中的字段,很不方便
sql = 'select * from user_info' # 语句后可不加分号,pymysql会自动添加
res = cursor.execute(sql) # 执行sql语句
# print(res) # execute返回的是当前sql语句所影响的行数,并不是查询结构
# ret = cursor.fetchone() # 只获取查询的结果中的一条数据
# ret = cursor.fetchall() # 获取查询结果的全部数据
# ret = cursor.fetchmany(2) # 获取指定行数的数据,如果数字超了,也不会报错
# print(ret)
print(cursor.fetchone())
print(cursor.fetchone()) # 连续使用2次,并不会重复展示表中的第一条数据,执行一次取掉一次数据,执行第二次就取表中的第二行数据
# 相对移动
cursor.scroll(2, 'relative') # 基于指针所在的位置 往后偏移 # 绝对移动
cursor.scroll(1, 'absolute') # 基于起始位置,往后偏移

sql注入问题

利用特殊符号和注释语法 巧妙的绕过真正的sql校验

关键性的数据 不要自己手动去拼接 而是交由execute帮你去做拼接

采用手动拼接的情况

import pymysql

conn = pymysql.connect(
user='root',
password='123',
host='localhost',
port=3306,
charset='utf8',
database='db1'
) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('username>>').strip()
password = input('password>>').strip()
sql = "select * from user_info where name = '%s' and password = '%s'" % (username, password)
# sql = 'select * from user_info where name = "%s" and password = "%s"' % (username, password)
# select * from user_info where name = "张三' -- fhjkasdhfkla" and password = "" 外层使用单引号出不来效果
print(sql)
cursor.execute(sql)
res = cursor.fetchall()
if res:
print(res)
else:
print('username or password error!')

解决办法:

交给pymysql中的execute进行处理

import pymysql

conn = pymysql.connect(
user='root',
password='123',
host='localhost',
port=3306,
charset='utf8',
database='db1'
) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input('username>>').strip()
password = input('password>>').strip()
# sql = "select * from user_info where name = '%s' and password = '%s'" % (username, password)
# sql = 'select * from user_info where name = "%s" and password = "%s"' % (username, password)
# select * from user_info where name = "张三' -- fhjkasdhfkla" and password = "" 外层使用单引号出不来效果
sql = "select * from user_info where name = %s and password = %s"
print(sql)
# cursor.execute(sql)
cursor.execute(sql, (username, password))
res = cursor.fetchall()
if res:
print(res)
else:
print('username or password error!')

数据的增删查改

尝试进行增操作:

import pymysql

conn = pymysql.connect(
user='root',
password='123',
host='localhost',
port=3306,
charset='utf8',
database='db1'
) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'insert into user_info(name, password) value("刘和平", 17)'
res = cursor.execute(sql)
print(res)

让我们去表中看看,是否增加上去:

显然,并没有新增一条数据。

在pymysql中,如果进行增删改等操作,对于这些执行重要程度偏高的语句,需要有一步确认操作(commit):

import pymysql

conn = pymysql.connect(
user='root',
password='123',
host='localhost',
port=3306,
charset='utf8',
database='db1'
) cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'insert into user_info(name, password) value("刘和平", 17)'
res = cursor.execute(sql)
conn.commit() # 提交
print(res)

观察表中的数据:

pymysql的基本使用的更多相关文章

  1. pyMysql

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

  2. Python 3.x 连接数据库(pymysql 方式)

    ==================pymysql=================== 由于 MySQLdb 模块还不支持 Python3.x,所以 Python3.x 如果想连接MySQL需要安装 ...

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

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

  4. 杂项之pymysql连接池

    杂项之pymysql连接池 本节内容 本文的诞生 连接池及单例模式 多线程提升 协程提升 后记 1.本文的诞生 由于前几天接触了pymysql,在测试数据过程中,使用普通的pymysql插入100W条 ...

  5. Python3中使用PyMySQL连接Mysql

    Python3中使用PyMySQL连接Mysql 在Python2中连接Mysql数据库用的是MySQLdb,在Python3中连接Mysql数据库用的是PyMySQL,因为MySQLdb不支持Pyt ...

  6. Python之路-python(mysql介绍和安装、pymysql、ORM sqlachemy)

    本节内容 1.数据库介绍 2.mysql管理 3.mysql数据类型 4.常用mysql命令 创建数据库 外键 增删改查表 5.事务 6.索引 7.python 操作mysql 8.ORM sqlac ...

  7. python pymysql和orm

    pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 1. 安装 管理员打开cmd,切换到python的安装路径,进入到Scripts目录下(如:C:\Users\A ...

  8. python成长之路【第十三篇】:Python操作MySQL之pymysql

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

  9. (转)pymysql 连接mysql数据库---不支持中文解决

    往数据库里插入中文时出现异常:UnicodeEncodeError: 'latin-1' codec can't encode characters 就是编码的问题,pymysql默认的编码是lati ...

  10. 循序渐进Python3(十)-- 1 -- pymysql

    使用pymsql 模块操作数据库 #!/usr/bin/env python , ),()]), user='root', passwd='123456', db='test')# 创建游标curso ...

随机推荐

  1. svn版本管理配置权限

    修改svn配置 编辑svnserve.conf文件 第19,20行删掉前面的#--意思就是打开 ancon-access = none  匿名用户不可读 auth-access = write 认证可 ...

  2. Mysql - 存储过程 - 定时删表

    在工业监控里面, 需要对每天的数据, 进行记录, 时间长了之后, 数据库很容易撑爆. 这时候, 如果允许, 可以对之前的数据进行一次清除, 只记录几个月内的数据. delimiter $ DROP P ...

  3. 转载:ubuntu下编译安装nginx及注册服务

    原文地址:https://www.cnblogs.com/EasonJim/p/7806879.html 安装gcc g++的依赖库 sudo apt-get install build-essent ...

  4. Netty — 线程模型

    一.前言 众所周知,netty是高性能的原因源于其使用的是NIO,但是这只是其中一方面原因,其IO模型上决定的.另一方面源于其线程模型的设计,良好的线程模型设计,能够减少线程上下文切换,减少甚至避免锁 ...

  5. 教你如何用Python向手机发送通知

    ------------恢复内容开始------------ 你曾想尝试在服务器端或电脑上向手机发送通知吗? 你曾烦恼过企业邮箱的防骚扰机制吗? 现在,我们可以用一种简单轻松的方法来代替企业邮箱了! ...

  6. 配置VS Code+React开发环境

    1.安装node+npm 2.安装VS Code 3.选择工作区文件夹——右键点击在终端中打开 4.按照Using React in Visual Studio Code的文档进行操作 npm ins ...

  7. Python类的定义、方法和属性使用

    类用来描述具有相同的属性和方法的对象的集合.对于在类中定义的函数,称为方法.类变量不直接叫做类变量,称为属性. 1.类的定义 例子: class User(): pass 说明: (1)定义了一个类名 ...

  8. React Hooks究竟是什么呢?

    摘要: React Hooks原理解析. 原文:快速了解 React Hooks 原理 译者:前端小智 我们大部分 React 类组件可以保存状态,而函数组件不能? 并且类组件具有生命周期,而函数组件 ...

  9. 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)

    跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...

  10. 解决vue+springboot前后端分离项目,前端跨域访问sessionID不一致导致的session为null问题

    问题: 前端跨域访问后端接口, 在浏览器的安全策略下默认是不携带cookie的, 所以每次请求都开启了一次新的会话. 在后台打印sessionID我们会发现, 每次请求的sessionID都是不同的, ...