python相当于一种客户端,用后台语言调用数据库从而进行一系列的操作
先创建连接,再获取游标,操作完毕后关闭游标,关闭连接
python2:pip install MySQLDB
python3:pip install pymysql
import pymysql
# 1、连接mysql数据库
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', password='root', db='mytest', charset='utf8')
# 2、获取游标对象
cs = conn.cursor()
# 3、通过游标对象执行sql语句,有返回值,且值为受影响的行数
r = cs.execute('select * from goods;')
print(r)
# 4、通过游标对象获取数据
print(cs.fetchone()) # 第一条数据
print(cs.fetchone()) # 第二条数据
# 获取多条,size=None默认获取一条,以元组形式返回,传入size就返回传入的行数
print(cs.fetchmany(2))
print(cs.fetchall()) # 获取剩下的条数,因为游标动了
print(cs.fetchone()) # 为None因为已经没有要获取的值了
# 关闭游标
cs.close()
# 关闭连接
conn.close()
可以在连接的时候添加异常捕获,防止连接不到数据库直接报错,注意异常捕获中的实例化对象
import pymysql
try:
conn = pymysql.connect(host='127.0.0.1',port=3306,password='root',user='root',database='mytest',charset='utf8')
except Exception as e: # e=Exception()e是一个实例的过程,虽然打印出来的是元组,但是并不能通过索引取值
print(e) # 想要拿它里面的参数,可以通过e.args[1]获取
cs = conn.cursor()
result = cs.execute('select * from goods')
print(cs.fetchone())
cs.close()
conn.close()
1、对象初始化时自动连接数据库连接数据库
2、定义获取单条,所有,多条数据的方法
3、程序结束时自动关闭连接
import pymysql
class MyDb(object):
def __init__(self):
self.my_conn()
def my_conn(self):
try:
self.conn = pymysql.connect(host='127.0.0.1', port=3306, password='root', user='root', database='mytest',
charset='utf8')
except Exception as e:
print(e)
def get_one(self):
cs = self.conn.cursor()
sql = 'select * from goods'
cs.execute(sql)
result = cs.fetchone()
cs.close()
return result
def get_all(self):
cs = self.conn.cursor()
sql = 'select * from goods'
cs.execute(sql)
result = cs.fetchall()
cs.close()
return result
def get_many(self, size):
cs = self.conn.cursor()
sql = 'select * from goods'
cs.execute(sql)
result = cs.fetchmany(size)
cs.close()
return result
def close_conn(self):
# 不需要在此处关闭游标,一是因为他不是类属性,想关可以通过传参,或者定义全局
# 变量去关,二是可以没调用一次游标方法,他都会重新创建一个游标,所以没必要关
self.conn.close()
def __del__(self): # 这个魔法方法可以在程序执行结束后自动触发,将关闭操作写在这里就不用手动调用了
self.conn.close()
def main():
db = MyDb()
# res = db.get_one()
# print(res)
# res = db.get_one()
# print(res)
# db.close_conn()
# res = db.get_all()
res = db.get_many(3)
print(res)
if __name__ == '__main__':
main()
输入1:查询所有商品
输入2:所有商品种类
输入3:查询所有品牌
输入4:退出
输入5:添加新商品的分类名
注意点:为了代码书写的规范性将不需要self的字段写在静态方法中通过装饰器去引用,将重复代码写在一个方法里面,避免冗余以及方便维护,框架结构一般都是这样一个类一个主函数,一个函数入口,在类的内部实现run方法实现它的逻辑
import pymysql
class MyTest(object):
def __init__(self):
self.conn = pymysql.connect(host='127.0.0.1', port=3306, password='root', user='root', database='mytest',
charset='utf8')
self.cs = self.conn.cursor()
def show_all_goods(self):
sql = 'select * from goods;'
self.execute_aql(sql)
def show_all_cates(self):
sql = 'select * from goods_cates;'
self.execute_aql(sql)
def add_brands(self):
name = input('请输入您想添加的商品分类')
sql = f"insert into goods_cates (name) values ('{name}')"
self.cs.execute(sql)
self.conn.commit()
def show_all_brands(self):
sql = 'select distinct brand_name from goods;'
self.execute_aql(sql)
def run(self):
while True:
num = self.print_menu()
if num == '1':
self.show_all_goods()
elif num == '2':
self.show_all_cates()
elif num == '3':
self.show_all_brands()
elif num == '4':
break
elif num == '5':
self.add_brands()
else:
print('输入有误,请重新输入')
@staticmethod
def print_menu():
print('输入1:查询所有商品')
print('输入2:所有商品种类')
print('输入3:查询所有品牌')
print('输入4:退出')
print('输入5:添加新商品的分类名')
num = input('请输入您想查询的数字:')
return num
def execute_aql(self, sql):
self.cs.execute(sql)
res = self.cs.fetchall()
for data in res:
print(data)
def __del__(self):
self.cs.close()
self.conn.close()
def main():
mt = MyTest()
mt.run()
if __name__ == '__main__':
main()
数据的增改删 --> 都是数据的修改
MyISAM --> 这个引擎不需要提交事务就可以修改数据,但是没有那么安全
InnoDB --> 这个引擎需要提交事务才可以修改数据,不提交,也不会报错但也不会修改数据相对安全
注意回滚,当插入语句只要有一句报错,就都不执行
'''
数据 增改删 --> 都是数据的修改
MyISAM --> 这个引擎不需要提交事务就可以修改数据,但是没有那么安全
InnoDB --> 这个引擎需要提交事务才可以修改数据,不提交,也不会报错但也不会修改数据相对安全
conn.rollback() 实现回滚,多条sql语句同时执行,只要有一条报错,就都不会执行
'''
import pymysql
def coperation_db():
try:
conn = pymysql.connect(host='127.0.0.1', port=3306, password='root', user='root', database='mytest',
charset='utf8')
cs = conn.cursor()
sql = 'insert into student (sid,sname) values(1,"beiyue"),(2,"wchao")'
cs.execute(sql)
sql = 'insert into student (sid,sname) values(1,"beiyue"),(2,"wchao")'
cs.execute(sql)
# 提交数据,可以同时执行多条inser语句的提交,注意报错之后就不提交了,自上而先,从右往左执行(可以使用异常捕获来健壮代码)
conn.commit()
cs.close()
conn.close()
except Exception as e:
print(e)
# conn.commit()
conn.rollback()
cs.close()
conn.close()
if __name__ == '__main__':
coperation_db()