Python MySQL

  • mysql入门
  • MySQL 数据库
  • 安装 MySQL 驱动程序
  • 测试 MySQL Connector
  • 创建连接
  • 创建数据库
  • 创建数据库
  • 检查数据库是否存在
  • 创建表
  • 创建表
  • 检查表是否存在
  • 主键
  • 插入表(`Insert`)
  • INSERT INTO
  • **插入多行**
  • **活动已插入的id**
  • Python Select From
  • 从表中选取
  • 选取列
  • 使用 fetchone() 方法
  • Python MySQL Where
  • 使用筛选器来选取
  • 通配符
  • 防止 SQL 注入
  • Python MySQL Order By
  • 结果排序
  • 降序排序
  • Python MySQL Delete From
  • 删除记录
  • 防止 [SQL 注入](https://blog.csdn.net/weixin_51047454/article/details/123533237?spm=1001.2014.3001.5501)
  • Python MySQL Drop Table
  • 删除表
  • 只在表存在时删除
  • Python 更新表
  • 更新表
  • 防止 SQL 注入
  • Python MySQL Limit
  • 限定结果
  • 从另一个位置开始

mysql入门

MySQL 数据库

为了能够试验本教程中的代码示例,应该在计算机上安装 MySQL。
请在这里下载免费的 MySQL 数据库:下载地址

安装 MySQL 驱动程序

Python 需要 MySQL 驱动程序来访问 MySQL 数据库。
在本教程中,我们将使用驱动程序 “MySQL Connector”。
我们建议使用 PIP 安装 “MySQL Connector”。
PIP 很可能已经安装在 Python 环境中。
将命令行导航到 PIP 的位置,然后键入以下内容:
下载并安装 “MySQL Connector”:

python -m pip install mysql-connector

测试 MySQL Connector

如需测试安装是否成功,或者是否已安装 “MySQL Connector”,运行下面代码,若无报错就表示安装成功:

import mysql.connector

创建连接

首先创建与数据库的连接。
使用 MySQL 数据库中的用户名和密码:

import mysql.connector
mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword"
)

print(mydb)

创建数据库

创建数据库

如需在 MySQL 中创建数据库,请使用 “CREATE DATABASE” 语句:

创建名为“zdz”的数据库

import mysql.connector

mydb=mysql.connector.connect(
	host="localhost",
  user="yourusername",
  passwd="yourpassword"
)

mycursor=mydb.cursor()
mycursor.execute("create database zdz")

(mydb和mycursor为变量)

检查数据库是否存在

可以通过使用“SHOW DATABASES”语句列出系统中所有数据库:

import mysql.connector

mydb=mysql.connector.connect(
	host="localhost",
  user="yourusername",
  passwd="yourpassword"
)

mycursor=mydb.cursor()
mycursor.execute("show databases")

for x in mycursor:
	print(x)


或者通过在建立连接时尝试访问数据库:

import mysql.connector

mydb=mysql.connector.connect(
	host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="zdz"
)

如果不错在名为“zdz”的数据库,会返回错误。

创建表

创建表

如需在 MySQL 中创建表,请使用 “CREATE TABLE” 语句。
(请确保在创建连接时定义数据库的名称。)

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="zdz"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE biao1 (id int(10),name varchar(10),passwd varchar(10))")
#sql语法:create table 表名(字段1名 字段1类型,字段2名 字段2类型,字段3名 字段3类型);

检查表是否存在

可以通过使用 “SHOW TABLES” 语句列出数据库中的所有表,来检查表是否存在:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="zdz"
)

mycursor = mydb.cursor()

mycursor.execute("SHOW TABLES")

for x in mycursor:
  print(x)

主键

创建表时,还应该为每条记录创建一个具有唯一键的列。
这可以通过定义 PRIMARY KEY 来完成。
我们使用语句 “INT AUTO_INCREMENT PRIMARY KEY”,它将为每条记录插入唯一的编号。从 1 开始,每个记录递增 1。

1、创建表时创建主键:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

mycursor.execute("CREATE TABLE biao2 (id int auto_increment primary key,name varchar(10),passwd varchar(10))")
#这里把主键给到“id”

2、如果表已存在,请使用 ALTER TABLE 关键字:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="mydatabase"
)

mycursor = mydb.cursor()

mycursor.execute("alter table biao1 add column idid int auto_increment primary key")

插入表(Insert

INSERT INTO

如需填充 MySQL 中的表,请使用 “INSERT INTO” 语句。
在表 “biao1” 中插入记录:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="zdz"
)
mycursor = mydb.cursor()

sql = "insert into biao1 (id,name, passwd) values ('1','admin','admin)"
mycursor.execute(sql)
#或者写成:
#sql = "insert into biao1 (id,name,passwd) values (%s,%s,%s)"
#val = ('1','admin','admin')
#mycursor.execute(sql,val)
mydb.commit()

print(mycursor.rowcount, "record inserted.")

重要:请注意语句 mydb.commit()。需要进行更改,否则表不会有任何改变。

插入多行

要在表中插入多行,请使用 executemany() 方法。
executemany() 方法的第二个参数是元组列表,包含要插入的数据:

用数据填充biao2:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="zdz"
)
mycursor = mydb.cursor()
sql = "insert into biao2 (name, passwd) VALUES (%s, %s)"
val = [
	('zdz','zdz32'),
	('bh','bh01'),
	('mjw','mjw16'),
	('zxr','zxr42'),
	('zyc','zyc43')
]
mycursor.executemany(sql, val)
mydb.commit()

print(mycursor.rowcount, "was inserted.")

活动已插入的id

可以通过询问 cursor 对象来获取刚插入的行的 id。
注释:如果插入不止一行,则返回最后插入行的 id。

插入一行并返回id:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="zdz"
)
mycursor = mydb.cursor()

sql = "INSERT INTO biao2 (name,passwd) VALUES (%s, %s)"
val = ("admin", "admin666")
mycursor.execute(sql, val)
mydb.commit()
print("1 record inserted, ID:", mycursor.lastrowid)

Python Select From

从表中选取

从表 “biao2” 中选取所有记录,并显示结果:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="yourusername",
  passwd="yourpassword",
  database="zdz"
)
mycursor = mydb.cursor()#和前面一样,下面为了简洁统统省略
mycursor.execute("SELECT * FROM biao2")#执行sql语句,结果赋给mycursor
myresult = mycursor.fetchall()#用了 fetchall() 方法,该方法从最后执行的语句中获取所有行,结果赋给myresult。
for x in myresult:
  print(x)#遍历myresult结果(下面为了简洁统统省略)


+fetchall() 方法:从最后执行的语句中获取所有行

选取列

如需只选择表中的某些列,请使用 “SELECT” 语句,后跟列名:
仅选择名称和地址列:

...

mycursor.execute("SELECT id,name,passwd FROM biao2")

...

使用 fetchone() 方法

如果只对一行感兴趣,可以使用 fetchone() 方法。fetchone() 方法将返回结果的第一行

...

mycursor.execute("SELECT * FROM biao2")
myresult = mycursor.fetchone()
print(myresult)#只返回一行,所以不用遍历

Python MySQL Where

使用筛选器来选取

从表中选择记录时,可以使用 “where” 语句对选择进行筛选:

...

sql = "SELECT * FROM biao2 WHERE name='zyc'"
mycursor.execute(sql)
myresult = mycursor.fetchall()
for x in myresult:
  print(x)#因为匹配条件的可能不止一条,所以需要遍历输出

通配符

也可以选择以给定字母或短语开头、包含或结束的记录。请使用 表示通配符。
查找密码中包含”2″的记录:

...

sql = "SELECT * FROM biao2 WHERE passwd LIKE '%1%'"
mycursor.execute(sql)
myresult = mycursor.fetchall()

...

防止 SQL 注入

当用户提供查询值时,应该转义这些值。此举是为了防止 SQL 注入,这是一种常见的网络黑客技术,可以破坏或滥用你的数据库
mysql.connector 模块拥有转义查询值的方法,
使用占位符 %s 方法来转义查询值:

...

sql = "SELECT * FROM customers WHERE passwd=%s"
pas = ("admin666", )
mycursor.execute(sql,pas)
myresult = mycursor.fetchall()

...


sql注入教程——>传送门

Python MySQL Order By

结果排序

请使用 ORDER BY 语句按升序或降序对结果进行排序。(ORDER BY 关键字默认按升序对结果进行排序。若要按降序对结果进行排序,请使用 DESC 关键字。)
以字符顺序对姓名进行排序:

...

mycursor.execute("SELECT * FROM biao2 ORDER BY name")

...

降序排序

请使用 DESC 关键字按降序对结果进行排序:

...

mycursor.execute("SELECT * FROM biao2 ORDER BY id DESC")

...

Python MySQL Delete From

删除记录

可以使用 “DELETE FROM” 语句从已有的表中删除记录:

...

mycursor.execute("DELETE FROM biao2 WHERE name = 'admin'")
mydb.commit()

...

注意
1.请注意语句 mydb.commit()。需要进行更改,否则表不会有任何改变。
2.请注意 DELETE 语法中的 WHERE 子句:WHERE 子句指定应删除哪些记录。如果省略 WHERE 子句,则将删除所有记录!

防止 SQL 注入

☆在 delete 语句中,转义任何查询的值也是一种好习惯。此举是为了防止 SQL 注入,这是一种常见的网络黑客技术,可以破坏或滥用你的数据库。
mysql.connector 模块使用占位符 %s 来转义 delete 语句中的值:

...

sql = "DELETE FROM biao2 WHERE passwd = %s"
pas = ("ylj31", )
mycursor.execute(sql,pas)
mydb.commit()

...

Python MySQL Drop Table

删除表

可以使用 “DROP TABLE” 语句来删除已有的表。
删除 “biao1” 表:

...

mycursor.execute("DROP TABLE biao1")

只在表存在时删除

如果要删除的表已被删除,或者由于任何其他原因不存在,那么可以使用 IF EXISTS 关键字以避免出错:

mycursor.execute("DROP TABLE IF EXISTS biao1")#添加'IF EXITS判断'

Python 更新表

更新表

可以使用 “UPDATE” 语句来更新表中的现有记录。
把密码列中的 “zdz32” 覆盖为 “zdz3232”:

...

mycursor.execute("UPDATE biao2 SET passwd='zdz3232' WHERE passwd='zdz32'")
mydb.commit()#要有
print(mycursor.rowcount, "record(s) affected")

注意:请注意 UPDATE 语法中的 WHERE 子句:WHERE 子句指定应更新的记录。如果省略 WHERE 子句,则所有记录都将更新!

防止 SQL 注入

同上,在update语句中要有转义的好习惯,防止sql注入。
mysql.connector 模块使用占位符 %s 来转义update 语句中的值:

sql = "UPDATE biao2 SET passwd= %s WHERE passwd = %s"
pas = ("pzdz32", "zdz3232")
mycursor.execute(sql,pas)
mydb.commit()

Python MySQL Limit

限定结果

可以使用 “LIMIT” 语句限制从查询返回的记录数。
选取 “biao2” 表中的前四条记录:

mycursor.execute("SELECT * FROM biao2 LIMIT 4")
myresult = mycursor.fetchall()#记得遍历输出

从另一个位置开始

如果想从第二条记录开始返回四条记录,您可以使用 “OFFSET” 关键字:

mycursor.execute("SELECT * FROM biao2 LIMIT 4 OFFSET 1")#因为从0开始数,所以要从第二个开始,offset后面跟1
myresult = mycursor.fetchall()

来源:埋头苦干的渗透小白

物联沃分享整理
物联沃-IOTWORD物联网 » python基础:Python MySQL

发表评论