Python PyMySQL操作MySQL数据库

Python PyMySQL操作MySQL数据库

这里主要介绍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()
第二种方法: 判断数据库base_name是否存在, 如果不存在则创建数据库base_name
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()
  1. 创建表的格式:

第一种方法: 直接创建第一种方法: 直接创建

sql = '''CREATE TABLE 表名 (属性名 数据类型 完整约束条件, 
							属性名 数据类型 完整约束条件, 
  							...
    						属性名 数据类型 完整约束条件)'''

第二种方法: 先判断数据库中是否有此表, 如果没有则创建

sql = '''CREATE TABLE IF NOT EXISTS 表名(属性名 数据类型 完整约束条件, 
										属性名 数据类型 完整约束条件, 
  										...
    									属性名 数据类型 完整约束条件)'''

上面提到的数据类型可以在菜鸟教程里具体查看。
完整约束条件:

PRIMARY KEY 标识该属性为该表的"主键", 可以唯一的标识对应的元组
PRIMARY KEY 标识该属性为该表的"主键", 可以唯一的标识对应的元组
FOREIGN KEY 标识该属性为该表的"外键", 是与之联系某表的主键
NOT NULL 标识该属性"不能为空"
UNIQUE 标识该属性的值是"唯一"的
AUTO_INCREMENT 标识该属性的值是"自动增加", 这是MySQL的SQL语句的特色
DEFAULT 为该属性设置默认值
  1. 设置表的主键
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))'
  1. 设置表的外键
格式:
  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链接
  1. 设置非空约束
格式:
  # 此属性不能为空, 不填的话会"报错"
  属性名 数据类型 NOT NULL
  1. 设置表的唯一约束
格式:
 # 此属性的值不能重复
 属性名 数据类型 UNIQUE
  1. 设置表的属性值自动增加
格式:
 # AUTO_INCREMNT约束的字段可以使任何整数类型(TINYINT, SMALLINT, INT和BIGINT), 在默认的情况下, 该字段是从1开始自增
 属性名 数据类型 AUTO_INCREMNT
  1. 设置表的属性的默认值
格式:
属性名 数据类型 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')

以上就是我对MySQL的一点心得,

第一次写博客, 如果哪里有错, 或是页面布局又不舒服的, 欢迎在评论区留言。

你可能感兴趣的:(MySQL操作)