数据库编程练习

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 数据库编程练习

今天主要学习数据库的编程练习,使用pyharm进行数据库的操作。


重要内容:


  1. sql注入:就是利用正常的sql语句,获取到了非法的数据(参数化可以解决)
  2. 使用pymysql模块进行数据库编程,实现查询、插入、删除、改数据等操作。
  3. 五个步骤
  1. 创建数据库的连接
  1. 数据库服务器的主机地址
  2. 数据库服务器端口
  3. 用户名
  4. 密码
  5. 数据库名
  6. 字符集
  1. 获取游标对象
  2. 执行sql操作
  3. 关闭游标
  4. 关闭数据库的连接
  1. 具体代码实现



from pymysql import Connect

db_count = Connect(host='localhost',port=3306,database='python_db',user='root',password='mysql',charset='utf8')

cur = db_count.cursor()

sql_str = """要执行的SQL语句"""

cur.execute(sql_str)

db_count.commit()

cur.close()

db_count.close()


上课所用代码:

1. 数据库编程

统一时刻只有一个游标存活cursor

"""
   使用pymysql模块进行数据库编程
   实现查询操作
   0 导入模块
   1 创建数据库连接
   2 获取游标对象
   3 执行sql操作
   4 关闭游标
   5 关闭数据库连接
"""
# 0导入模块
from pymysql import connect
# 1创建数据库连接
# 6个参数
# 参数一:数据库服务器的主机地址
# 参数二:数据库服务器端口
# 参数三:用户名
# 参数四:密码
# 参数五:数据库名
# 参数六:字符集
# 注意:
#       参数因为使用关键字参数,可以无序
#       除端口号用整数类型外,其余参数全部使用字符串
db_connect = connect(host='localhost',port=3306,user = 'root',password='mysql',database='python_db',charset='utf8')
# 2获取游标对象
cur = db_connect.cursor()
# 3执行sql操作
# 准备sql指令字符串
# sql_str = """select * from students where name ="小明";"""
sql_str = """select * from students;"""
row_count = cur.execute(sql_str)
print('sql操作一共影响了 %d 行数据' % row_count)
print('sql操作一共影响了 %d 行数据' % cur.rowcount)
print('sql操作一共影响了 %d 行数据' % cur.rownumber)
print('*'*30)
# 获取查询结果
# 方法一: 获取单条数据(返回结果是一个元祖)
result = cur.fetchone()
print(result)
print('*'*30)
# 方式二 获取指定条数的数据(返回值是一个嵌套的元祖)
result = cur.fetchmany(4)
for t in result:
   print(t)
print('*'*30)
# 方式三 获取所有的数据(返回值嵌套的元祖)
result = cur.fetchall()
for t in result:
   print(t)
print('*'*30)
# 滚动游标
# cur.scroll(-10,'relative') 相对移动游标,负数是向回移动
cur.scroll(1,'absolute')  # 绝对移动,参数一是移动的数据的索引,从0开始计数
result = cur.fetchall()
for t in result:
   print(t)
print('*'*30)
# 4关闭游标
cur.close()
# 5关闭数据库连接
db_connect.close()


1.1增删改查

"""
   使用pymysql模块向数据库中插入数据
   当获取一个游标对象时,游标会自动开启一个隐式的事务
"""
from pymysql import Connect
db_count = Connect(host='localhost',port=3306,database='python_db',user='root',password='mysql',charset='utf8')
cur = db_count.cursor()
sql_str = """insert into students (name) values ('王刚蛋');"""
cur.execute(sql_str)
# 当执行玩增删改操作之后,需要去操作进行提交,(实际上是对事务进行提交)
# 如果不做提交操作,那么当关闭数据库时,数据库会默认回滚
db_count.commit()
cur.close()
db_count.close()


from pymysql import Connection
db_count = Connection(host='localhost',port=3306,database='python_db',user='root',password='mysql',charset='utf8')
cur = db_count.cursor()
sql_str = """delete from students where name = '王刚蛋'"""
cur.execute(sql_str)
# 当执行玩增删改操作之后,需要去操作进行提交,(实际上是对事务进行提交)
# 如果不做提交操作,那么当关闭数据库时,数据库会默认回滚
db_count.commit()
cur.close()
db_count.close()


from pymysql import Connection
db_count = Connection(host='localhost',port=3306,database='python_db',user='root',password='mysql',charset='utf8')
cur = db_count.cursor()
sql_str = """update students set height = 165 where name = '周杰伦'"""
cur.execute(sql_str)
# 当执行玩增删改操作之后,需要去操作进行提交,(实际上是对事务进行提交)
# 如果不做提交操作,那么当关闭数据库时,数据库会默认回滚
db_count.commit()
cur.close()
db_count.close()


自动提交

"""开启自动提交(了解)一般都是手动提交"""
from pymysql import connect
db_connect = connect(host='localhost',port=3306,database='python_db',user='root',password='mysql',charset ='utf8')
# 开启自动提交
db_connect.autocommit(True)
cur = db_connect.cursor()
sql_str = """insert into students (name) values ('王钢蛋 %d 号')"""
for i in range(5):
   cur.execute(sql_str % i)
cur.close()
db_connect.close()


事务操作

"""
   当创建游标对象时,游标对象会默认开启一个隐式事务
   可以通过commit提交
   可以通过rollback回滚
   如果没有任何操作时,当数据库关闭,那么会默认执行回滚操作
"""
# 导入模块
import random
from pymysql import connect
db_connect = connect(host='localhost',port=3306,user='root',password='mysql',database='python_db',charset='utf8')
cur = db_connect.cursor()
# 默认会开启一个事务
sql_str = """insert into students (name) values ('铁锤妹妹')"""
try:
   for i in range(5):
       cur.execute(sql_str)
   # 取一个随机数来判断是否成功
   n = random.randint(0,1)
   if n == 0:
       print('------------',n)
       # 说明出错了,去抛出一个异常
       raise Exception
except Exception as e:
   print('出现异常,进行数据回滚')
   # 使用数据库对象进行回滚操作
   db_connect.rollback()
   # 虽然出错,但是自动增长会被记录,下次提交成功的话,自动增长会从上次记录的地方开始
else:
   print('数据提交成功')
   db_connect.commit()
finally:
   cur.close()
   db_connect.close()



1.2 SQL注入

什么是SQL注入?

  • 产生原因: 后台对用户提交的带有恶意的数据和 SQL 进行字符串方式的拼接,得到了脱离原意的 SQL 语句,从而影响了 SQL 语句的语义,最终产生数据泄露的现象。
  • 如何防止: SQL 语句的参数化, 将 SQL 语句的所有数据参数存在一个列表中传递给 execute 函数的第二个参数

SQL注入利用了SQL语法正常规则,得到了不该得到的非法数据,导致了数据泄露

解决办法:参数化

"""
   SQL注入是利用了SQL语法的正常规则,得到了不该得到的非法数据,导致数据泄露
   解决办法,使用参数化
"""
from pymysql import *
db_connect = Connect(host='localhost',port=3306,database='python_db',user='root',password='mysql',charset='utf8')
cur = db_connect.cursor()
# 请输入一个查询的ID
query_id = input('please input ID:')
# 查询 指定的ID数据
# sql_str = """select * from students where id = %s""" % query_id
# print(sql_str)
# cur.execute(sql_str)
# 使用参数化来解决SQL注入
sql_str = """select * from students where id =%s"""
# 在准备sql字符串时,不能再直接拼接参数
# 而是将参数做成一个元祖,列表字典,传入到execute 方法中
# 这种方式就是参数化
params = (query_id,)
# params = [query_id]
# params = {'name_id':query_id}
# sql_str = """select * from students where id = %(name_id)s"""
# 'root\'--'
cur.execute(sql_str,params)
result = cur.fetchall()
for t in result:
   print(t)
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
3月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
57 1
|
6月前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
5月前
|
存储 数据库 Python
python的对象数据库ZODB的使用(python3经典编程案例)
该文章介绍了如何使用Python的对象数据库ZODB来进行数据存储,包括ZODB的基本操作如创建数据库、存储和检索对象等,并提供了示例代码。
84 0
|
5月前
|
JSON NoSQL 数据库
和SQLite数据库对应的NoSQL数据库:TinyDB的详细使用(python3经典编程案例)
该文章详细介绍了TinyDB这一轻量级NoSQL数据库的使用方法,包括如何在Python3环境中安装、创建数据库、插入数据、查询、更新以及删除记录等操作,并提供了多个编程案例。
243 0
|
6月前
|
存储 SQL 数据库
【计算机三级数据库技术】第8章 数据库后台编程技术--附思维导图
本文介绍了数据库后台编程的关键技术,包括存储过程、用户定义函数、触发器和游标,并附有思维导图。
54 1
|
6月前
|
存储 SQL 数据库
|
6月前
|
SQL 数据库 索引
SQL 编程最佳实践简直太牛啦!带你编写高效又可维护的 SQL 代码,轻松应对数据库挑战!
【8月更文挑战第31天】在SQL编程中,高效与可维护的代码至关重要,不仅能提升数据库性能,还降低维护成本。本文通过案例分析探讨SQL最佳实践:避免全表扫描,利用索引加速查询;合理使用JOIN,避免性能问题;避免使用`SELECT *`,减少不必要的数据传输;使用`COMMIT`和`ROLLBACK`确保事务一致性;添加注释提高代码可读性。遵循这些实践,不仅提升性能,还便于后期维护和扩展。应根据具体情况选择合适方法并持续优化SQL代码。
88 0
|
6月前
|
SQL 关系型数据库 MySQL
"Python与MySQL的浪漫邂逅:一键掌握增删改查,开启你的数据库编程之旅!"
【8月更文挑战第21天】Python因其简洁的语法和强大的库支持,成为连接数据库的首选工具。本文介绍如何使用Python连接MySQL数据库并执行基本操作。首先需安装`mysql-connector-python`库。通过配置连接信息建立数据库连接后,可利用`cursor.execute()`执行SQL语句进行数据的增删改查,并通过`commit()`提交更改。查询时使用`fetchall()`或`fetchone()`获取结果。记得处理异常及关闭连接以释放资源。掌握这些基础,有助于高效进行数据库编程。
97 0
|
8月前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
102 3

热门文章

最新文章