1.在MySQL中创建数据库
"""创建mysql数据库""" import pymysql # 数据库连接引用类 from pymysql.connections import Connection # 游标操作类 from pymysql.cursors import Cursor # 通过pymysql的方法connect()方法声明一个MySQL连接对象conn。分别传入本地IP、用户名、密码、默认端口 conn = pymysql.connect(host="localhost", user="root", password="yang123", port=3306) # <class 'pymysql.connections.Connection'> 生成连接对象Connection的实例 print(type(conn)) # 调用连接实例对象的cursor()方法获得MySQL的操作游标 cursor = conn.cursor() # <class 'pymysql.cursors.Cursor'> 生成游标对象Cursor的实例 print(type(cursor)) # 调用游标实例对象的execute()方法执行sql语句,查看数据库版本 cursor.execute("select version()") # 调用游标实例对象的fetchone()方法获得数据库版本的信息 data = cursor.fetchone() # 打印数据库版本信息 print("database version:", data) # 利用游标执行sql语句创建数据库并设置数据库编码utf8 cursor.execute("create database demo default character set utf8") # 关闭连接 conn.close() # 关闭游标 cursor.close()
2.在数据库创建一张待操作表
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() # 定义要执行的SQL语句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE, age TINYINT NOT NULL )ENGINE=innodb DEFAULT CHARSET=utf8; """ # 执行SQL语句 cursor.execute(sql) # 关闭光标对象 cursor.close() # 关闭数据库连接 conn.close()
# 导入pymysql模块(返回字典格式数据) import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句并且将结果作为字典返回的游标 cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 定义要执行的SQL语句 sql = """ CREATE TABLE USER1 ( id INT auto_increment PRIMARY KEY , name CHAR(10) NOT NULL UNIQUE, age TINYINT NOT NULL )ENGINE=innodb DEFAULT CHARSET=utf8; """ # 执行SQL语句 cursor.execute(sql) # 关闭光标对象 cursor.close() # 关闭数据库连接 conn.close()
2.1扩展的创建数据库表方法
""" MySQL数据库中创建表 """ import pymysql # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称 db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo") # 调用连接实例对象的cursor()方法获得MySQL的操作游标 cursor = db.cursor() # 编辑创建数据库表的sql语句 sql = "create table if not exists students (id varchar(32) not null, name varchar(64) not null unique, age int not null, primary key (id))" # 到数据库执行编辑的sql语句 cursor.execute(sql) # 关闭数据库连接 db.close() # 关闭游标对象 cursor.close()
3.向已创建的表中增加数据
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 # 执行SQL语句 cursor.execute(sql, [username, age]) # 提交事务 conn.commit() cursor.close() conn.close()
# 导入pymysql模块(在这里也可以加入事务回滚机制) import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 try: # 执行SQL语句 cursor.execute(sql, [username, age]) # 提交事务 conn.commit() except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
# 导入pymysql模块(获取当前写入数据id,关联操作时会用到) import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "Alex" age = 18 try: # 执行SQL语句 cursor.execute(sql, [username, age]) # 提交事务 conn.commit() # 提交之后,获取刚插入的数据的ID last_id = cursor.lastrowid except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
# 导入pymysql模块(批量执行) import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" data = [("Alex", 18), ("Egon", 20), ("Yuan", 21)] try: # 批量执行多条插入SQL语句 cursor.executemany(sql, data) # 提交事务 conn.commit() except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
3.1插入数据的通用方法
""" 插入数据的通用方法 事务的4个属性 1.原子性:事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做 2.一致性:事务必须使数据库从一个一致性状态表更到另一个一致性状态。一致性与原子性是密切相关的 3.隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰 4.持久性:持久性也是永久性。指一个事务一旦提交,它对数据库中的数据改变就是永久性的。接下来的其他操作都不应该对其有任何影响 """ import pymysql # 待插入的数据 data = { 'id': '20190116', 'name': 'xia', 'age': 21 } # 表名 table = "students" # 构造动态待插入字段的字符串 keys = ", ".join(data.keys()) # 构造将要插入数据的动态字符串 values = ", ".join(["%s"] * len(data)) # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称 db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo") # 调用连接实例对象的cursor()方法获得MySQL的操作游标 cursor = db.cursor() # 通用的sql语句插入方法,根据字典或者元组动态构造数据库插入语句 sql = "INSERT INTO {table}({keys}) VALUES({values})".format(table=table, keys=keys, values=values) # 采用事务机制,保留操作的原子性。要么失败要么成功,不会出现数据的不完整情况 try: # 传入待插入的数据 if cursor.execute(sql, tuple(data.values())): print("成功提交") # 提交sql语句到数据库执行 db.commit() except: # 发生异常事务回滚。相当于什么都没发生过 db.rollback() print("提交失败") # 关闭连接 db.close() # 关闭游标对象 cursor.close()
4.删除表中的数据
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "DELETE FROM USER1 WHERE id=%s;" try: cursor.execute(sql, [4]) # 提交事务 conn.commit() except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
4.1删除数据的通用方法
""" 数据删除的通用方法 """ import pymysql # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称 db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo") # 调用连接实例对象的cursor()方法获得MySQL的操作游标 cursor = db.cursor() # 表名称 table = "students" # 删除条件。在这里可以有<、>、=、like、and、or等筛选条件 condition = "age>24" # delete from students where age>24构造的sql语句 sql = "delete from {table} where {condition}".format(table=table, condition=condition) try: # 传入待删除的数据 cursor.execute(sql) # 正式提交sql语句 db.commit() except: # 发生异常事务回滚。相当于什么都没发生过 db.rollback() # 关闭数据库连接 db.close() # 关闭游标对象 cursor.close()
5.修改表中的数据
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() # 修改数据的SQL语句 sql = "UPDATE USER1 SET age=%s WHERE name=%s;" username = "Alex" age = 80 try: # 执行SQL语句 cursor.execute(sql, [age, username]) # 提交事务 conn.commit() except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
5.1数据更新的通用方法
"""数据更新的通用方法 实现一种去重的方法,如果数据存在,则更新数据、如果数据不存在,则插入数据 """ import pymysql # 待更新的数据 data = { "id": "20190112", "name": "yang", "age": 25 } # 表名 table = "students" # 构造动态待更新字段的字符串 keys = ", ".join(data.keys()) # 构造将要更新数据的动态字符串 values = ", ".join(["%s"] * len(data)) # 通用的sql语句更新方法,根据字典或者元组动态构造数据库更新语句 sql = "insert into {table}({keys}) values({values}) on duplicate key update".format(table=table, keys=keys, values=values) # 构造需要更新的占位符键值对字符串 # 'id=%s, name=%s, age=%s' update = ",".join([" {key}=%s".format(key=key) for key in data]) # 拼接完整的数据库更新语句 sql += update print(sql) # insert into students(id, name, age) values(%s, %s, %s) on duplicate key update id=%s, name=%s, age=%s # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称 db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo") # 调用连接实例对象的cursor()方法获得MySQL的操作游标 cursor = db.cursor() try: # 传入待更新的数据,因为这个sql需要传入两处的占位符,第二个参数则乘以2 if cursor.execute(sql, tuple(data.values())*2): print("提交成功") # 正式提交sql语句到数据库执行 db.commit() except: print("提交失败") # 发生异常事务回滚。相当于什么都没发生过 db.rollback() # 关闭数据库连接 db.close() # 关闭游标对象 cursor.close()
6.查看表中的数据
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() # 查询数据的SQL语句 sql = "SELECT id,name,age from USER1 WHERE id=1;" # 执行SQL语句 cursor.execute(sql) # 获取单条查询数据 ret = cursor.fetchone() cursor.close() conn.close() # 打印下查询结果 print(ret)
6.1查询数据的推荐方法
""" 数据查询的通用方法 """ import pymysql # 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称 db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo") # 调用连接实例对象的cursor()方法获得MySQL的操作游标 cursor = db.cursor() # 将要查询的sql语句 sql = "select * from students where age >= 21" try: # 传入待执行的sql语句 cursor.execute(sql) # 打印查询的总数 print("Count", cursor.rowcount) # 查到的第一个数据 one = cursor.fetchone() # 元组的元素跟数据库中表的字段一一对应。第一个元素就是字段id等... print("One", one) """此方法一次查询所有的数据,如果数据很大占用的开销会很高 # 因为已查询一个,偏移指针会从第二个开始查询之后所有的数据 many = cursor.fetchall() # Many (('20190113', 'tang', 23), ('20190116', 'xia', 21)) print("Many", many) # 元组包含元组的类型 print("Many Type", type(many)) for row in many: # 循环取值打印 print(row) """ # 推荐方法while循环取值 while one: print("One", one) one = cursor.fetchone() except: print("Error")
7.扩展用法和注意事项
# 可以获取指定数量的数据 cursor.fetchmany(3) # 光标按绝对位置移动1 cursor.scroll(1, mode="absolute") # 光标按照相对位置(当前位置)移动1 cursor.scroll(1, mode="relative") SQL注入问题 1. SQL语句在程序中是字符串,动态拼接的字符串,不要拿用户输入的内容去拼接字符串 2. 不要自己拼接字符串