当前位置:   article > 正文

Python——连接数据库操作_cursor.execute(sql)

cursor.execute(sql)

一、数据库基础用法

要先配置环境变量,然后cmd安装:pip install pymysql

1、连接MySQL,并创建wzg库

  1. #引入decimal模块
  2. import pymysql
  3. #连接数据库
  4. db=pymysql.connect(host='localhost',user='root',password='1234',charset='utf8')
  5. #创建一个游标对象(相当于指针)
  6. cursor=db.cursor()
  7. #执行创建数据库语句
  8. cursor.execute('create schema wzg default charset=utf8;')
  9. cursor.execute('show databases;')
  10. #fetchone获取一条数据(元组类型)
  11. print(cursor.fetchone())
  12. #现在指针到了[1]的位置
  13. #fetchall获取全部数据(字符串类型)
  14. all=cursor.fetchall()
  15. for i in all:
  16. print(i[0])
  17. #关闭游标和数据库连接
  18. cursor.close()
  19. db.close()

2、创建student表,并插入数据

  1. import pymysql
  2. #连接数据库,并打开wzg数据库(数据库已创建)
  3. db=pymysql.connect(host='localhost',user='root',password='1234',charset='utf8',db='wzg')
  4. #创建游标对象
  5. cursor=db.cursor()
  6. try:
  7. #创建student表,并执行
  8. sql='''create table student(
  9. SNO char(10),
  10. SNAME varchar(20) NOT NULL,
  11. SSEX varchar(1),
  12. primary key(SNO)
  13. )default charset=utf8;'''
  14. cursor.execute(sql)
  15. #插入一条数据,并执行
  16. insert_sql='''
  17. insert into student values('200303016','王智刚',''),('20030001','小明','')
  18. '''
  19. cursor.execute(insert_sql)
  20. #将数据提交给数据库(加入数据,修改数据要先提交)
  21. db.commit()
  22. #执行查询语句
  23. cursor.execute('select * from student')
  24. #打印全部数据
  25. all=cursor.fetchall()
  26. for i in all:
  27. print(i)
  28. #发生错误时,打印报错原因
  29. except Exception as e:
  30. print(e)
  31. #无论是否报错都执行
  32. finally:
  33. cursor.close()
  34. db.close()

数据库中char和varchar的区别:
char类型的长度是固定的,varchar的长度是可变的。

例如:存储字符串'abc',使用char(10),表示存储的字符将占10个字节(包括7个空字符),
使用varchar(10),表示只占3个字节,10是最大值,当存储的字符小于10时,按照实际的长度存储。

二、项目:银行管理系统

完成功能:1.查询 2.取钱 3.存钱 4.退出

练习:创建信息表,并进行匹配

1、创建数据库为(bank),账户信息表为(account)

account_id(varchar(20))

Account_passwd(char(6))

Money(decimal(10,2))

001

123456

1000.00

002

456789

5000.00

2、拓展:进行账号和密码的匹配

请输入账号:001
请输入密码:123456
select * from account where account_id=001 and Account_passwd=123456
if cursor.fetchall():
登录成功
else:
登录失败

  1. import pymysql
  2. # 连接数据库
  3. db = pymysql.connect(host='localhost', user='root', password='1234', charset='utf8')
  4. cursor = db.cursor()
  5. # 创建bank库
  6. cursor.execute('create database bank charset utf8;')
  7. cursor.execute('use bank;')
  8. try:
  9. # # 创建表
  10. # sql = '''create table account(
  11. # account_id varchar(20) NOT NULL,
  12. # account_passwd char(6) NOT NULL,
  13. # money decimal(10,2),
  14. # primary key(account_id)
  15. # );'''
  16. # cursor.execute(sql)
  17. # # 插入数据
  18. # insert_sql = '''
  19. # insert into account values('001','123456',1000.00),('002','456789',5000.00)
  20. # '''
  21. # cursor.execute(insert_sql)
  22. # db.commit()
  23. # # 查询所有数据
  24. # cursor.execute('select * from account')
  25. # all = cursor.fetchall()
  26. # for i in all:
  27. # print(i)
  28. # 输入账号和密码
  29. z=input("请输入账号:")
  30. m=input("请输入密码:")
  31. # 从account表中进行账号和密码的匹配
  32. cursor.execute('select * from account where account_id=%s and account_passwd=%s',(z,m))
  33. # 如果找到,则登录成功
  34. if cursor.fetchall():
  35. print('登录成功')
  36. else:
  37. print('登录失败')
  38. except Exception as e:
  39. print(e)
  40. finally:
  41. cursor.close()
  42. db.close()

1、进行初始化操作

  1. import pymysql
  2. # 创建bank库
  3. CREATE_SCHEMA_SQL='''
  4. create schema bank charset utf8;
  5. '''
  6. # 创建account表
  7. CREATE_TABLE_SQL = '''
  8. create table account(
  9. account_id varchar(20) NOT NULL,
  10. account_passwd char(6) NOT NULL,
  11. # decimal用于保存精确数字的类型,decimal(10,2)表示总位数最大为12位,其中整数10位,小数2位
  12. money decimal(10,2),
  13. primary key(account_id)
  14. ) default charset=utf8;
  15. '''
  16. # 创建银行账户
  17. CREATE_ACCOUNT_SQL = '''
  18. insert into account values('001','123456',1000.00),('002','456789',5000.00);
  19. '''
  20. # 初始化
  21. def init():
  22. try:
  23. DB = pymysql.connect(host='localhost',user='root',password='1234',charset='utf8')
  24. cursor1 = DB.cursor()
  25. cursor1.execute(CREATE_SCHEMA_SQL)
  26. DB = pymysql.connect(host='localhost',user='root',password='1234',charset='utf8',database='bank')
  27. cursor2 = DB.cursor()
  28. cursor2.execute(CREATE_TABLE_SQL)
  29. cursor2.execute(CREATE_ACCOUNT_SQL)
  30. DB.commit()
  31. print('初始化成功')
  32. except Exception as e:
  33. print('初始化失败',e)
  34. finally:
  35. cursor1.close()
  36. cursor2.close()
  37. DB.close()
  38. # 不让别人调用
  39. if __name__ == "__main__":
  40. init()

2、登录检查,并选择操作

  1. import pymysql
  2. # 定义全局变量为空
  3. DB=None
  4. # 创建Account类
  5. class Account():
  6. # 传入参数
  7. def __init__(self,account_id,account_passwd):
  8. self.account_id=account_id
  9. self.account_passwd=account_passwd
  10. # 登录检查
  11. def check_account(self):
  12. cursor=DB.cursor()
  13. try:
  14. # 把输入账号和密码进行匹配(函数体内部传入参数用self.)
  15. SQL="select * from account where account_id=%s and account_passwd=%s" %(self.account_id,self.account_passwd)
  16. cursor.execute(SQL)
  17. # 匹配成功返回True,失败返回False
  18. if cursor.fetchall():
  19. return True
  20. else:
  21. return False
  22. except Exception as e:
  23. print("错误原因:",e)
  24. finally:
  25. cursor.close()
  26. # 查询余额
  27. # def query_money
  28. # 取钱
  29. # def reduce_money
  30. # 存钱
  31. # def add_money
  32. def main():
  33. # 定义全局变量
  34. global DB
  35. # 连接bank库
  36. DB=pymysql.connect(host="localhost",user="root",passwd="1234",database="bank")
  37. cursor=DB.cursor()
  38. # 输入账号和密码
  39. from_account_id=input("请输入账号:")
  40. from_account_passwd=input("请输入密码:")
  41. # 输入的参数传入给Account类,并创建account对象
  42. account=Account(from_account_id,from_account_passwd)
  43. # 调用check_account方法,进行登录检查
  44. if account.check_account():
  45. choose=input("请输入操作:\n1、查询余额\n2、取钱\n3、存钱\n4、取卡\n")
  46. # 当输入不等于4的时候执行,等于4则退出
  47. while choose!="4":
  48. # 查询
  49. if choose=="1":
  50. print("111")
  51. # 取钱
  52. elif choose=="2":
  53. print("222")
  54. # 存钱
  55. elif choose=="3":
  56. print("333")
  57. # 上面操作完成之后,继续输入其他操作
  58. choose = input("请输入操作:\n1、查询余额\n2、取钱\n3、存钱\n4、取卡\n")
  59. else:
  60. print("谢谢使用!")
  61. else:
  62. print("账号或密码错误")
  63. DB.close()
  64. main()

3、加入查询功能

存在银行里的钱可能会产生利息,所以需要考虑余额为小数的问题,需要用到decimal库

  1. import pymysql
  2. # 引入decimal模块
  3. import decimal
  4. DB=None
  5. class Account():
  6. def __init__(self,account_id,account_passwd):
  7. self.account_id=account_id
  8. self.account_passwd=account_passwd
  9. # 登录检查
  10. def check_account(self):
  11. cursor=DB.cursor()
  12. try:
  13. SQL="select * from account where account_id=%s and account_passwd=%s" %(self.account_id,self.account_passwd)
  14. cursor.execute(SQL)
  15. if cursor.fetchall():
  16. return True
  17. else:
  18. return False
  19. except Exception as e:
  20. print("错误",e)
  21. finally:
  22. cursor.close()
  23. # 查询余额
  24. def query_money(self):
  25. cursor=DB.cursor()
  26. try:
  27. # 匹配账号密码,并返回money
  28. SQL="select money from account where account_id=%s and account_passwd=%s" %(self.account_id,self.account_passwd)
  29. cursor.execute(SQL)
  30. money=cursor.fetchone()[0]
  31. # 如果账户有钱就返回金额,没钱返回0.00
  32. if money:
  33. # 返回值为decimal类型,quantize函数进行四舍五入,'0.00'表示保留两位小数
  34. return str(money.quantize(decimal.Decimal('0.00')))
  35. else:
  36. return 0.00
  37. except Exception as e:
  38. print("错误原因",e)
  39. finally:
  40. cursor.close()
  41. def main():
  42. global DB
  43. DB=pymysql.connect(host="localhost",user="root",passwd="1234",charset="utf8",database="bank")
  44. cursor=DB.cursor()
  45. from_account_id=input("请输入账号:")
  46. from_account_passwd=input("请输入密码:")
  47. account=Account(from_account_id,from_account_passwd)
  48. if account.check_account():
  49. choose=input("请输入操作:\n1、查询余额\n2、取钱\n3、存钱\n4、取卡\n")
  50. while choose!="4":
  51. # 查询
  52. if choose=="1":
  53. # 调用query_money方法
  54. print("您的余额是%s元" % account.query_money())
  55. # 取钱
  56. elif choose=="2":
  57. print("222")
  58. # 存钱
  59. elif choose=="3":
  60. print("333")
  61. choose = input("请输入操作:\n1、查询余额\n2、取钱\n3、存钱\n4、取卡\n")
  62. else:
  63. print("谢谢使用")
  64. else:
  65. print("账号或密码错误")
  66. DB.close()
  67. main()

4、加入取钱功能

取钱存钱要用update来执行数据库,还要注意取钱需要考虑余额是否充足的问题

  1. import pymysql
  2. import decimal
  3. DB=None
  4. class Account():
  5. def __init__(self,account_id,account_passwd):
  6. self.account_id=account_id
  7. self.account_passwd=account_passwd
  8. # 登录检查
  9. def check_account(self):
  10. cursor=DB.cursor()
  11. try:
  12. SQL="select * from account where account_id=%s and account_passwd=%s" %(self.account_id,self.account_passwd)
  13. cursor.execute(SQL)
  14. if cursor.fetchall():
  15. return True
  16. else:
  17. return False
  18. except Exception as e:
  19. print("错误",e)
  20. finally:
  21. cursor.close()
  22. # 查询余额
  23. def query_money(self):
  24. cursor=DB.cursor()
  25. try:
  26. SQL="select money from account where account_id=%s and account_passwd=%s" %(self.account_id,self.account_passwd)
  27. cursor.execute(SQL)
  28. money=cursor.fetchone()[0]
  29. if money:
  30. return str(money.quantize(decimal.Decimal('0.00')))
  31. else:
  32. return 0.00
  33. except Exception as e:
  34. print("错误原因",e)
  35. finally:
  36. cursor.close()
  37. # 取钱(注意传入money参数)
  38. def reduce_money(self,money):
  39. cursor = DB.cursor()
  40. try:
  41. # 先调用query_money方法,查询余额
  42. has_money=self.query_money()
  43. # 所取金额小于余额则执行(注意类型转换)
  44. if decimal.Decimal(money) <= decimal.Decimal(has_money):
  45. # 进行数据更新操作
  46. SQL="update account set money=money-%s where account_id=%s and account_passwd=%s" %(money,self.account_id,self.account_passwd)
  47. cursor.execute(SQL)
  48. # rowcount进行行计数,行数为1则将数据提交给数据库
  49. if cursor.rowcount==1:
  50. DB.commit()
  51. return True
  52. else:
  53. # rollback数据库回滚,行数不为1则不执行
  54. DB.rollback()
  55. return False
  56. else:
  57. print("余额不足")
  58. except Exception as e:
  59. print("错误原因",e)
  60. finally:
  61. cursor.close()
  62. # 存钱
  63. # def add_money
  64. def main():
  65. global DB
  66. DB=pymysql.connect(host="localhost",user="root",passwd="1234",charset="utf8",database="bank")
  67. cursor=DB.cursor()
  68. from_account_id=input("请输入账号:")
  69. from_account_passwd=input("请输入密码:")
  70. account=Account(from_account_id,from_account_passwd)
  71. if account.check_account():
  72. choose=input("请输入操作:\n1、查询余额\n2、取钱\n3、存钱\n4、取卡\n")
  73. while choose!="4":
  74. # 查询
  75. if choose=="1":
  76. print("您的余额是%s元" % account.query_money())
  77. # 取钱
  78. elif choose=="2":
  79. # 先查询余额,再输入取款金额,防止取款金额大于余额
  80. money=input("您的余额是%s元,请输入取款金额" % account.query_money())
  81. # 调用reduce_money方法,money不为空则取款成功
  82. if account.reduce_money(money):
  83. print("取款成功,您的余额还有%s元" % account.query_money())
  84. else:
  85. print("取款失败!")
  86. # 存钱
  87. elif choose=="3":
  88. print("333")
  89. choose = input("请输入操作:\n1、查询余额\n2、取钱\n3、存钱\n4、取卡\n")
  90. else:
  91. print("谢谢使用!")
  92. else:
  93. print("账号或密码错误")
  94. DB.close()
  95. main()

5、加入存钱功能

存钱功能和取钱功能相似,而且不需要考虑余额的问题,至此已完善当前所有功能

  1. import pymysql
  2. import decimal
  3. DB=None
  4. class Account():
  5. def __init__(self,account_id,account_passwd):
  6. self.account_id=account_id
  7. self.account_passwd=account_passwd
  8. # 登录检查
  9. def check_account(self):
  10. cursor=DB.cursor()
  11. try:
  12. SQL="select * from account where account_id=%s and account_passwd=%s" %(self.account_id,self.account_passwd)
  13. cursor.execute(SQL)
  14. if cursor.fetchall():
  15. return True
  16. else:
  17. return False
  18. except Exception as e:
  19. print("错误",e)
  20. finally:
  21. cursor.close()
  22. # 查询余额
  23. def query_money(self):
  24. cursor=DB.cursor()
  25. try:
  26. SQL="select money from account where account_id=%s and account_passwd=%s" %(self.account_id,self.account_passwd)
  27. cursor.execute(SQL)
  28. money=cursor.fetchone()[0]
  29. if money:
  30. return str(money.quantize(decimal.Decimal('0.00')))
  31. else:
  32. return 0.00
  33. except Exception as e:
  34. print("错误原因",e)
  35. finally:
  36. cursor.close()
  37. # 取钱
  38. def reduce_money(self,money):
  39. cursor = DB.cursor()
  40. try:
  41. has_money=self.query_money()
  42. if decimal.Decimal(money) <= decimal.Decimal(has_money):
  43. SQL="update account set money=money-%s where account_id=%s and account_passwd=%s" %(money,self.account_id,self.account_passwd)
  44. cursor.execute(SQL)
  45. if cursor.rowcount==1:
  46. DB.commit()
  47. return True
  48. else:
  49. DB.rollback()
  50. return False
  51. else:
  52. print("余额不足")
  53. except Exception as e:
  54. print("错误原因",e)
  55. finally:
  56. cursor.close()
  57. # 存钱
  58. def add_money(self,money):
  59. cursor = DB.cursor()
  60. try:
  61. SQL="update account set money=money+%s where account_id=%s and account_passwd=%s" %(money,self.account_id,self.account_passwd)
  62. cursor.execute(SQL)
  63. if cursor.rowcount==1:
  64. DB.commit()
  65. return True
  66. else:
  67. DB.rollback()
  68. return False
  69. except Exception as e:
  70. DB.rollback()
  71. print("错误原因",e)
  72. finally:
  73. cursor.close()
  74. def main():
  75. global DB
  76. DB=pymysql.connect(host="localhost",user="root",passwd="1234",charset="utf8",database="bank")
  77. cursor=DB.cursor()
  78. from_account_id=input("请输入账号:")
  79. from_account_passwd=input("请输入密码:")
  80. account=Account(from_account_id,from_account_passwd)
  81. if account.check_account():
  82. choose=input("请输入操作:\n1、查询余额\n2、取钱\n3、存钱\n4、取卡\n")
  83. while choose!="4":
  84. # 查询
  85. if choose=="1":
  86. print("您的余额是%s元" % account.query_money())
  87. # 取钱
  88. elif choose=="2":
  89. money=input("您的余额是%s元,请输入取款金额" % account.query_money())
  90. if account.reduce_money(money):
  91. print("取款成功,您的余额还有%s元" % account.query_money())
  92. else:
  93. print("取款失败!")
  94. # 存钱
  95. elif choose=="3":
  96. money=input("请输入存款金额:")
  97. if account.add_money(money):
  98. print("存款成功,您的余额还有%s元,按任意键继续\n" % (account.query_money()))
  99. else:
  100. print("存款失败,按任意键继续")
  101. choose = input("请输入操作:\n1、查询余额\n2、取钱\n3、存钱\n4、取卡\n")
  102. else:
  103. print("谢谢使用!")
  104. else:
  105. print("账号或密码错误")
  106. DB.close()
  107. main()

原文链接:Python——连接数据库操作 - 王智刚 - 博客园
作者:王智刚

如果觉得本文对你有帮助,可以转发关注支持一下

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/968733
推荐阅读
相关标签
  

闽ICP备14008679号