这里主要介绍python 3中PyMySQL操作MySQL数据库的方法
在开始之前:
①确保已经安装好了MySQL数据库并保证能正常运行, 这里我就不多说了, 不会的话自行百度
②确保安装好PyMySQL库
推荐pip安装:
pip install pymsql
# 导入pymysql
import pymysql
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306)
定义光标
cursor = db.cursor()
嗯~~ 插点东西, 下面会用到的(想了半天不知道插到哪, 就放这儿了)
实行sql语句
cursor.execute(sql)
数据插入
# 执行db对象的commit()方法才可以实现数据插入, 这个方法才是真正将语句提交到数据库执行的方法, 对于数据插入、更新、删除操作, 都需要调用该方法才能生效
db.commit()
数据回滚
# 如果执行失败, 则调用rollback()执行数据回滚, 相当于什么都没有发生过
db.rollback()
获取当前MySQL版本
get_version_sql = 'SELECT VERSION()'
查看已经存在的数据库
exist_sql = 'SHOW DATABASES'
实行SQL语句cursor.execute(sql)
fetchone(): 返回单个元组 调用一次fetchone()
方法, 指针就会指向下一条数据
fetchall(): 返回所有元组 会将结果以元祖形式全部返回, 如果数据量很大, 那么占用的开销会非常高, 最好用while
循环加fetchone()
方法来获取所有数据
cursor.execute(get_version_sql)
data = cursor.fetchone()
print('Database version:', data)
'''
我的返回的是
> Database version: ('5.7.23-log',)
''''
cursor.execute(exist_sql)
tables = cursor.fetchall()
print(tables)
'''这个查看数据库的就不展示了!'''
关闭数据库
db.close()
注意: MySQL自动将数据库名的大写字母替换为小写字母(也没什么大不了的)
数据回滚db.rollback()
如果执行失败, 则调用rollback()执行数据回滚, 相当于什么都没有发生过
try:
# 创建数据库 默认字符集utf8
sql = 'CREATE DATABASE 库名 DEFAULT CHARACTER SET utf8'
cursor.execute(sql)
except:
print('Failure')
db.rollback()
import re
import pymysql
db = pymysql.connect(host='localhost', user='root', password='yao120', port=3306)
cursor = db.cursor()
# 查看所有数据库, 然后以列表形式返回
cursor.execute('SHOW DATABASES')
tables = [cursor.fetchall()]
table_list = re.findall("\('(.*?)',\)", str(tables), re.I)
# 需要创建的数据库
base_name = 'Once_Upon_a_Time'
if base_name.lower() not in table_list:
# create dataase创建数据库
# default character set utf8 默认字符集utf8
cursor.execute('CREATE DATABASE %s DEFAULT CHARACTER SET utf8' % base_name)
else:
print(base_name + '数据库已存在')
# 不要忘了close()一下
db.close()
sql = 'DROP DATABASE 库名'
链接数据库时指定数据库 db=‘库名’
import pymysql
# 链接mysql db='库名'
db = pymysql.connect(host='localhost', user='root', password='yao120', port=3306, db='Once_Upon_a_Time')
cursor = db.cursor()
第一种方法: 直接创建第一种方法: 直接创建
sql = '''CREATE TABLE 表名 (属性名 数据类型 完整约束条件,
属性名 数据类型 完整约束条件,
...
属性名 数据类型 完整约束条件)'''
第二种方法: 先判断数据库中是否有此表, 如果没有则创建
sql = '''CREATE TABLE IF NOT EXISTS 表名(属性名 数据类型 完整约束条件,
属性名 数据类型 完整约束条件,
...
属性名 数据类型 完整约束条件)'''
上面提到的数据类型可以在菜鸟教程里具体查看。
完整约束条件:
PRIMARY KEY | 标识该属性为该表的"主键", 可以唯一的标识对应的元组 |
---|---|
PRIMARY KEY | 标识该属性为该表的"主键", 可以唯一的标识对应的元组 |
FOREIGN KEY | 标识该属性为该表的"外键", 是与之联系某表的主键 |
NOT NULL | 标识该属性"不能为空" |
UNIQUE | 标识该属性的值是"唯一"的 |
AUTO_INCREMENT | 标识该属性的值是"自动增加", 这是MySQL的SQL语句的特色 |
DEFAULT | 为该属性设置默认值 |
1.单字段主键格式:
属性名 数据类型 PRIMARY KEY
实例:
# id 为主键
sql = 'CREATE TABLE 表名(id int PRIMARY KEY, name varchar(20))'
2.多字段主键格式:
PRIMARY KEY(属性名1, 属性名2..., 属性名n)
实例:
# id, stu_id为主键
sql = 'CREATE TABLE 表名(id int, stu_id int, name varchar(20), PRIMARY KEY(id, stu_id))'
格式:
CONSTRAINT 外键别名 FOREIGN KEY(属性1, 属性2..., 属性n) REFERENCES 表名(属性1, 属性2..., 属性n)
实例:
sql = '''CREATE TABLE 表名1 (id int RPIMARY KEY,
stu_id int,
name varchar(20),
CONSTRAINT 外键别名 FOREIGN KEY(stu_id) REFERENCES 表名2(id))'''
# 创建表1, 将表1的stu_id与表2的id链接
格式:
# 此属性不能为空, 不填的话会"报错"
属性名 数据类型 NOT NULL
格式:
# 此属性的值不能重复
属性名 数据类型 UNIQUE
格式:
# AUTO_INCREMNT约束的字段可以使任何整数类型(TINYINT, SMALLINT, INT和BIGINT), 在默认的情况下, 该字段是从1开始自增
属性名 数据类型 AUTO_INCREMNT
格式:
属性名 数据类型 DEFAULT 默认值
sql = '''CREATE TABLE hero(id int PRIMARY KEY AUTO_INCREMENT,
name varchar(20) NOT NULL,
sex varchar(10) DEFAULT "male")'''
# 创建hero表, id为主键和自动增加, name为非空, sex默认是'male'
查看表结构
通过查看表的结构, 就很明确的对表进行解读, 而且可以查看一下自己创建的表有没有错误
格式:
DESCRIBE 表名
查看表详细结构
通过这个SQL语句可以查看表的详细定义, 除了字段名, 字段的数据类型, 约束条件外, 还可以查看表的默认存储引擎和字符编码
格式:
SHOW CREATE TABLE 表名
1.修改表名:
格式:
ALTER TABLE 原表名 RENAME 新表明
2.修改字段的数据类型:
格式:
ALTER TABLE 表名 MODIFY 属性名 数据类型
3.修改字段名:
格式:
ALTER TABLE 表名 CHANGE 原属性名 新属性名 新数据类型
4.增加字段:
格式:
ALTER TABLE 表名 ADD 属性名1 数据类型 完整性约束条件 [FIRST | AFTER 属性名2]
# 其中, "属性名1"参数指需要增加的字段的名称, "FIRST"参数是可选参数, 起作用是将新增字段设置为表的第一个字段, "AFTER"参数也是可选的参数, 其作用是将新增字段添加到已有的"属性名2"字段的后面.
5.删除字段:
格式:
ALTER TABLE 表名 DROP 属性名
6.更改表的存储引擎:
格式:
ALTER TABLE 表名 ENGINE = 存储引擎名
7.删除表的外键约束:
格式:
ALTER TABLE 表名 DROP FOREIGN KEY 外键别名
格式:
# 删除没有被关联的普通表
DROP TABLE 表名
# 删除被其他表关联的父表
1. 先删除子表, 再删除父表
2. 删除父表的外键约束, 再删该表
sql = 'select table_name from information_schema.tables where table_schema="Once_Upon_a_Time" and table_type="base table"'
cursor.execute(sql)
# 表的总数
count = cursor.rowcount
print(count)
# 遍历所有表
row = cursor.fetchone()
rows = []
while row:
rows += row
row = cursor.fetchone()
print(rows)
格式:
INSERT INTO 表名 (属性名1, 属性名2..., 属性名n) values(属性值1, 属性值2..., 属性值n)
实例:
~~注意: 如果数据类型是字符串的, 需要加上双引号, 不然报错
def insert_into(table_name, name, age):
insert_sql = 'INSERT INTO %s(name, age) values("%s", %s)'
try:
cursor.execute(insert_sql % (table_name, name, age))
# commit() 提交
db.commit()
print('数据添加成功!')
except:
'''
注意: 如果执行失败, 则调用rollback()执行数据回滚, 相当于什么都没有发生过.
'''
db.rollback()
格式:
DELETE FROM 表名 WHERE 属性名="属性值"
def delete_field(table_name, del_id):
# 删除一条数据
'''
delete 删除 from 从哪里 where 删除的数据信息
table_name 表名
del_id 想要删除的id
'''
delete_sql = 'DELETE FROM %s where %s="%s"'
try:
cursor.execute(delete_sql % (table_name, 'id', del_id))
db.commit()
print('id:%s 删除成功!' % del_id)
except:
db.rollback()
print('delete Failed')
格式:
UPDATE 表名 SET 更新的属性名1 = 更新的属性值1 WHERE 属性名2 = 属性值2
属性名2最好是有唯一约束的, 不会重复
实例
def update(table_name, name, age):
# 更新列表中, name为%s的age属性为%s
update_sql = 'UPDATE %s SET age = %s WHERE name = %s'
try:
cursor.execute(update_sql, (table_name, age, name))
db.commit()
except:
db.rollback()
print('Failed')
判断有着 唯一约束的
id
是否存在 如果存在则更新数据, 如果不存在则插入数据
def insert_or_update(table_name, id, name, age):
table_name = tuple([table_name])
data = id, name, age
sql = 'INSERT INTO %s(id, name, age) values (%s, "%s", %s) ON DUPLICATE KEY UPDATE id = %s, name = "%s", age = %s'
try:
cursor.execute(sql % (table_name + data * 2))
db.commit()
print('数据更新成功!')
except:
db.rollback()
print('Failed')
格式:
SELECT * FROM 表名 WHERE 属性名=属性值
实例:
sql = 'SELECT * FROM hero WHERE name = "Snow"'
try:
cursor.execute(sql)
count = cursor.rowcount
print('Snow共有%d条数据' % count)
row = cursor.fetchone()
while row:
row_list = list(row)
row = cursor.fetchone()
print(row_list)
except:
print('Failed')