python操作数据库的过程:
创建连接—获取游标—执行命令—关闭游标—关闭连接
python访问mysql 要用pymysql库
pymysql需要安装:pip install pymysql
安装完之后导入pymysql,创建连接
连接数据库的参数按照实际情况添加,端口号默认是3306,我的有冲突,改成了3307
# 导入pymysqlimport pymysql# 定义一个函数# 这个函数用来创建连接(连接数据库用)def mysql_db(): # 连接数据库肯定需要一些参数 conn = pymysql.connect( host="127.0.0.1", port=3307, database="lebo", charset="utf8", user="root", passwd="root" )if __name__ == '__main__': mysql_db()
关于游标,执行SQL,查询数据
游标需要创建游标还要关闭游标,为了防止忘关游标,所以用with
# 打开数据库可能会有风险,所以添加异常捕捉 try: with conn.cursor() as cursor: # 准备SQL语句 sql = "select * from user" # 执行SQL语句 cursor.execute(sql) # 执行完SQL语句后的返回结果都是保存在cursor中 # 所以要从cursor中获取全部数据 datas = cursor.fetchall() print("获取的数据:\n", datas) except Exception as e: print("数据库操作异常:\n", e) finally: # 不管成功还是失败,都要关闭数据库连接 conn.close()
cursor中获取数据的fetchall,fetchone,fetchmany
fetchall:获取当前SQL语句能查出来的全部数据
fetchone:每次获取一条数据。但是获取到这条数据后,指针会往后移一行数据
fetchmany:直接告诉它想要多少条数据
插入一条数据
重点一个是commit,一个是rollback。有提交的地方一定要有回滚。回滚到上次提交的地方
try: with conn.cursor() as cursor: # 准备SQL语句 value = "12,'鲁肃'" sql = f"insert into user values ({value});" # 执行SQL语句 cursor.execute(sql) # 执行完要提交 conn.commit() print("提交成功") except Exception as e: # 如果执行失败要回滚 conn.rollback() print("数据库操作异常:\n", e) finally: # 不管成功还是失败,都要关闭数据库连接 conn.close()
添加多条数据
try: with conn.cursor() as cursor: # 准备要插入的数据 # 插入一条 # value = "12,'鲁肃'" # 插入多条 value = "(13,'张三'),(14,'李四'),(15,'王五')" # 准备SQL语句 sql = f"insert into user values {value};" # 执行SQL语句 cursor.execute(sql) # 执行完要提交 conn.commit() print("提交成功") except Exception as e: # 如果执行失败要回滚 conn.rollback() print("数据库操作异常:\n", e) finally: # 不管成功还是失败,都要关闭数据库连接 conn.close()
表中可以看到已经插入成功
修改、更新数据
只需要修改添加的SQL语句,其他不变
增删改查,除了查询,其他都需要提交
try: with conn.cursor() as cursor: # 准备SQL语句 sql = f"update user set name='封控了' where id = 1 ;" # 执行SQL语句 cursor.execute(sql) # 执行完要提交 conn.commit() print("提交成功") except Exception as e: # 如果执行失败要回滚 conn.rollback() print("数据库操作异常:\n", e) finally: # 不管成功还是失败,都要关闭数据库连接 conn.close()
删除数据
try: with conn.cursor() as cursor: # 准备SQL语句 sql = "delete from user where id = 12;" # 执行SQL语句 cursor.execute(sql) # 执行完要提交 conn.commit() print("删除成功") except Exception as e: # 如果执行失败要回滚 conn.rollback() print("数据库操作异常:\n", e) finally: # 不管成功还是失败,都要关闭数据库连接 conn.close()
封装一个需要自己写SQL语句的mysql工具类
'''封装一个mysql工具类(需要自己写SQL语句)功能:mysql数据库操作步骤: 1.连接数据库 2.通过连接对象,获取游标对象 3.增删改查操作方法: 1.查 2.增删改 commit,rollback'''# 先要导入pymysqlimport pymysql# 把连接参数定义成字典config = { "host": "127.0.0.1", "port": 3307, "database": "lebo", "charset": "utf8", "user": "root", "passwd": "root"}class Mysqldb(): # 初始化方法 def __init__(self): # 初始化方法中调用连接数据库的方法 self.conn = self.get_conn() # 调用获取游标的方法 self.cursor = self.get_cursor() # 连接数据库的方法 def get_conn(self): # **config代表不定长参数 conn = pymysql.connect(**config) return conn # 获取游标 def get_cursor(self): cursor = self.conn.cursor() return cursor # 查询sql语句返回的所有数据 def select_all(self, sql): self.cursor.execute(sql) return self.cursor.fetchall() # 查询sql语句返回的一条数据 def select_one(self, sql): self.cursor.execute(sql) return self.cursor.fetchone() # 查询sql语句返回的几条数据 def select_many(self, sql, num): self.cursor.execute(sql) return self.cursor.fetchmany(num) # 增删改除了SQL语句不一样其他都是一样的,都需要提交 def commit_data(self, sql): try: # 执行语句 self.cursor.execute(sql) # 提交 self.conn.commit() print("提交成功") except Exception as e: print("提交出错\n:", e) # 如果出错要回滚 self.conn.rollback() # 当对象被销毁时,游标要关闭,连接也要关闭 # 创建时是先创建连接后创建游标,关闭时是先关闭游标后关闭连接 def __del__(self): self.cursor.close() self.conn.close()
调用
# 已经封装好mysql类了,就不用导入pymsql了,直接导入封装好的类from mysql_util import Mysqldb# 实例化my_db = Mysqldb()# 写查询SQL语句sql = "select * from user where id>5"# 查询所有select_all = my_db.select_all(sql)print("查询所有数据:\n", select_all)# 查询一条select_one = my_db.select_one(sql)print("查询一条数据:\n", select_one)# 查询多条select_many = my_db.select_many(sql, 3)print("查询3条数据:\n", select_many)# 新增一条数据value = (16, 'BBQ')sql = f"insert into user values {value}"insert_one = my_db.commit_data(sql)# 新增多条数据values = "(17, 'aaa'), (18, 'bbb'), (19, 'ccc')"sql = f"insert into user values {values}"insert_many = my_db.commit_data(sql)# 修改数据sql = "update user set name = '出不去了' where id = 17"my_db.commit_data(sql)# 删除数据sql = "delete from user where id = 17"my_db.commit_data(sql)
封装一个不用写SQL语句,只需要填参数的工具类
只写了基本的增删改查,后面可以根据实际情况添加
import pymysqlclass Database(): # **config是指连接数据库时需要的参数,这样只要参数传入正确,连哪个数据库都可以 # 初始化时就连接数据库 def __init__(self, **config): try: # 连接数据库的参数我不希望别人可以动,所以设置私有 self.__conn = pymysql.connect(**config) self.__cursor = self.__conn.cursor() except Exception as e: print("数据库连接失败:\n", e) # 查询一条数据 # 参数:表名table_name,条件factor_str,要查询的字段field 默认是查询所有字段* def select_one(self, table_name, factor_str='', field="*"): if factor_str == '': sql = f"select {field} from {table_name}" else: sql = f"select {field} from {table_name} where {factor_str}" self.__cursor.execute(sql) return self.__cursor.fetchone() # 查询多条数据 # 参数:要查询数据的条数num,表名table_name,条件factor_str,要查询的字段field 默认是查询所有字段* def select_many(self, num, table_name, factor_str='', field="*"): if factor_str == '': sql = f"select {field} from {table_name}" else: sql = f"select {field} from {table_name} where {factor_str}" self.__cursor.execute(sql) return self.__cursor.fetchmany(num) # 查询全部数据 # 参数:表名table_name,条件factor_str,要查询的字段field 默认是查询所有字段* def select_all(self, table_name, factor_str='', field="*"): if factor_str == '': sql = f"select {field} from {table_name}" else: sql = f"select {field} from {table_name} where {factor_str}" self.__cursor.execute(sql) return self.__cursor.fetchall() # 新增数据 def insert(self,table_name, value): sql = f"insert into {table_name} values {value}" try: self.__cursor.execute(sql) self.__conn.commit() print("插入成功") except Exception as e: print("插入失败\n", e) self.__conn.rollback() # 修改数据 # 参数:表名,set值(可能是一个,也可能是多个,所以用字典),条件 def update(self, table_name, val_obl,change_str): sql = f"update {table_name} set" # set后面应该是要修改的字段,但是可能会修改多个字段的值,所以遍历一下 # key对应字段的名,val对应字段的值 for key, val in val_obl.items(): sql += f" {key} = {val}," # 遍历完的最后面会有一个逗号,所以给它切掉,然后再拼接条件 # !!!空格很重要 sql = sql[:-1]+" where "+change_str try: self.__cursor.execute(sql) self.__conn.commit() print("修改成功") except Exception as e: print("修改失败\n", e) self.__conn.rollback() # 删除数据 def delete(self,table_name, item): sql = f"delete from {table_name} where {item}" try: self.__cursor.execute(sql) self.__conn.commit() print("删除成功") except Exception as e: print("删除失败\n", e) self.__conn.rollback()
引用 ↓
# 导包from mysql_normal_util import Database# 设置连接数据库的参数config = { "host": "127.0.0.1", "port": 3307, "database": "lebo", "charset": "utf8", "user": "root", "passwd": "root"}# 实例化时就直接传参数db = Database(**config)# 查询1条select_one = db.select_one("user")print(select_one)# 查询多条select_many = db.select_many(3, "user")print(select_many)# 查询所有数据(根据条件)select_all = db.select_all("user", "id>10")print(select_all)# 新增一条数据db.insert("user","(20,'111')")# 新增多条数据db.insert("user", "(21,'123'),(22,'456')")# 修改一个字段的数据db.update("user", {"name": "222"}, "id=20")# 修改多个字段的数据db.update("user", {"id": "23", "name": "12345"}, "id=103")# 删除数据db.delete("user", "id=23")