为了能够试验本教程中的代码示例,应该在计算机上安装 MySQL。
请在这里下载免费的 MySQL 数据库:下载地址。
Python 需要 MySQL 驱动程序来访问 MySQL 数据库。
在本教程中,我们将使用驱动程序 “MySQL Connector”。
我们建议使用 PIP 安装 “MySQL Connector”。
PIP 很可能已经安装在 Python 环境中。
将命令行导航到 PIP 的位置,然后键入以下内容:
下载并安装 “MySQL Connector”:
python -m pip install 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
)如需填充 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.")
可以通过询问 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)
从表 “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() 方法将返回结果的第一行:
...
mycursor.execute("SELECT * FROM biao2")
myresult = mycursor.fetchone()
print(myresult)#只返回一行,所以不用遍历
从表中选择记录时,可以使用 “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 注入,这是一种常见的网络黑客技术,可以破坏或滥用你的数据库
mysql.connector 模块拥有转义查询值的方法,例
:
使用占位符 %s
方法来转义查询值:
...
sql = "SELECT * FROM customers WHERE passwd=%s"
pas = ("admin666", )
mycursor.execute(sql,pas)
myresult = mycursor.fetchall()
...
sql注入教程——>传送门
请使用 ORDER BY
语句按升序或降序对结果进行排序。(ORDER BY 关键字默认按升序对结果进行排序。若要按降序对结果进行排序,请使用 DESC
关键字。)
以字符顺序对姓名进行排序:
...
mycursor.execute("SELECT * FROM biao2 ORDER BY name")
...
请使用 DESC
关键字按降序对结果进行排序:
...
mycursor.execute("SELECT * FROM biao2 ORDER BY id DESC")
...
可以使用 “DELETE FROM
” 语句从已有的表中删除记录:
...
mycursor.execute("DELETE FROM biao2 WHERE name = 'admin'")
mydb.commit()
...
注意
:
1.请注意语句 mydb.commit()
。需要进行更改,否则表不会有任何改变。
2.请注意 DELETE 语法中的 WHERE 子句:WHERE 子句指定应删除哪些记录。如果省略 WHERE 子句,则将删除所有记录!
☆在 delete 语句中,转义任何查询的值也是一种好习惯。此举是为了防止 SQL 注入,这是一种常见的网络黑客技术,可以破坏或滥用你的数据库。
mysql.connector 模块使用占位符 %s 来转义 delete 语句中的值:
...
sql = "DELETE FROM biao2 WHERE passwd = %s"
pas = ("ylj31", )
mycursor.execute(sql,pas)
mydb.commit()
...
可以使用 “DROP TABLE
” 语句来删除已有的表。
删除 “biao1” 表:
...
mycursor.execute("DROP TABLE biao1")
如果要删除的表已被删除,或者由于任何其他原因不存在,那么可以使用 IF EXISTS
关键字以避免出错:
mycursor.execute("DROP TABLE IF EXISTS biao1")#添加'IF EXITS判断'
可以使用 “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 子句,则所有记录都将更新!
同上,在update语句中要有转义的好习惯,防止sql注入。
mysql.connector 模块使用占位符 %s 来转义update 语句中的值:
sql = "UPDATE biao2 SET passwd= %s WHERE passwd = %s"
pas = ("pzdz32", "zdz3232")
mycursor.execute(sql,pas)
mydb.commit()
可以使用 “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()