python与数据库(与Mysql的常用操作)

Python链接MySQL数据库

步骤:

  • 连接数据库
  • 生成游标对象
  • 执行SQL语句
  • 关闭游标
  • 关闭连接
  • pymysql
    • pymysql: 是封装了MySQL驱动的Python驱动,一个能使Python连接到MySQL的库

pymysql安装

pip install pymysql

查看版本

pip show pymysql

首先我们的pymysql数据库已安装,且已建好名为test的数据库,其中有名为student的表

import pymysql
#连接数据库
conn=pymysql.connect(host = '127.0.0.1',    # 连接名称,默认127.0.0.1 
                     user = 'root', # 用户名
                     passwd='password', # 密码
                     port= 3306,    # 端口,默认为3306
                     db='test', # 数据库名称
                     charset='utf8'# 字符编码
                    )
cur = conn.cursor() # 生成游标对象
sql="select * from student " # SQL语句
cur.execute(sql) # 执行SQL语句
data = cur.fetchall() # 通过fetchall方法获得数据
for i in data[:2]: # 打印输出前2条数据
    print (i)
cur.close() # 关闭游标
conn.close() # 关闭连接

上述代码中,实现了通过Python连接MySQL查询所有的数据,并输出前2条数据的功能。执行结果如下:

('a', '赵大', '16')
('b', '钱二', '16')

Python对MySql数据库实现增删改查

import pymysql
#连接数据库
conn=pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1 
                     user = 'root', # 用户名
                     passwd='password', # 密码
                     port= 3306, # 端口,默认为3306
                     db='test', # 数据库名称
                     charset='utf8', # 字符编码
                    )
cur = conn.cursor() # 生成游标对象 
#=插入语句===================
sql= “INSERT INTO student VALUES ('p','魏六','17')”
#===================================================
try:
    cur.execute(sql1) # 执行插入的sql语句
    conn.commit() # 提交到数据库执行
except:
    coon.rollback()# 如果发生错误则回滚

conn.close() # 关闭数据库连接

import pymysql
#连接数据库
conn=pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1 
                     user = 'root', # 用户名
                     passwd='password', # 密码
                     port= 3306, # 端口,默认为3306
                     db='test', # 数据库名称
                     charset='utf8', # 字符编码
                    )
cur = conn.cursor() # 生成游标对象 
#=删除语句===================
sql = "DELETE FROM student WHERE 学号 = 'a'"
try:
    cur.execute(sql) # 执行插入的sql语句
    conn.commit() # 提交到数据库执行
except:
    coon.rollback()# 如果发生错误则回滚

conn.close() # 关闭数据库连接

import pymysql
#连接数据库
conn=pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1 
                     user = 'root', # 用户名
                     passwd='password', # 密码
                     port= 3306, # 端口,默认为3306
                     db='test', # 数据库名称
                     charset='utf8', # 字符编码
                    )
cur = conn.cursor() # 生成游标对象 
#更新语句===================
sql ="UPDATE student SET 学员姓名 = '欧阳' WHERE 学号 = 'b'"

try:
    cur.execute(sql) # 执行插入的sql语句
    conn.commit() # 提交到数据库执行
except:
    coon.rollback()# 如果发生错误则回滚

conn.close() # 关闭数据库连接

import mysql.connector
conn=mysql.connector.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1 
                             user = 'root', # 用户名
                             passwd='password', # 密码
                             port= 3306, # 端口,默认为3306
                             db='test', # 数据库名称
                             charset='utf8', # 字符编码
                            )
cur = conn.cursor() # 生成游标对象
sql="select * from student " # SQL语句
cur.execute(sql) # 执行SQL语句
data = cur.fetchall() # 通过fetchall方法获得数据
for i in data[:]: # 打印输出所有数据
    print (i)
cur.close() # 关闭游标
conn.close() # 关闭连接

执行结果就是:

('b', '钱二', '16')
('c', '张三', '17')
('d', '李四', '17')
('e', '王五', '16')
('a', '赵大', '16')
('p', '魏六', '17')

小型案例

import pymysql

config = {
  'host': '127.0.0.1',
  'port': 3306,
  'user': 'root',
  'passwd': 'password',
  'charset':'utf8',
}
conn = pymysql.connect(**config)

cursor = conn.cursor()

try:
    创建数据库
    DB_NAME = 'test_3'
    cursor.execute('DROP DATABASE IF EXISTS %s', DB_NAME)
    cursor.execute('CREATE DATABASE IF NOT EXISTS %s' , DB_NAME)
    conn.select_db(DB_NAME)

    #创建表
    TABLE_NAME = 'bankData'
    cursor.execute('CREATE TABLE %s(id int primary key,money int(30))', TABLE_NAME)
    
    批量插入纪录
    values = []
    for i in range(20):
        values.append((int(i),int(156*i)))
    cursor.executemany('INSERT INTO bankData values(%s,%s)', values)
    conn.commit()
    
    查询数据条目
    count = cursor.execute('SELECT * FROM %s', TABLE_NAME)
    print ('total records:{}'.format(cursor.rowcount))
    
    获取表名信息
    desc = cursor.description
    print ("%s %3s" % (desc[0][0], desc[1][0]))
    
    cursor.scroll(10,mode=‘absolute’)
    results = cursor.fetchall()
    for result in results:
        print (result)

except:
    import traceback
    traceback.print_exc()

    # 发生错误时会滚
    conn.rollback()
finally:
    # 关闭游标连接
    cursor.close()

    # 关闭数据库连接
    conn.close()

综合案例

银行转账系统

先建立数据库test_3和表bankdata

import pymysql

config = {
'host': '127.0.0.1',
'port': 3306,
'user': 'root',
'passwd': 'password',
'charset':'utf8',

}
conn = pymysql.connect(**config)

cursor = conn.cursor()

try:

    创建数据库
    DB_NAME = 'test_3'
    cursor.execute('DROP DATABASE IF EXISTS %s', DB_NAME)
    cursor.execute('CREATE DATABASE IF NOT EXISTS %s', DB_NAME)
    conn.select_db(DB_NAME)
    
    #创建表
    TABLE_NAME = 'bankData'
    cursor.execute('CREATE TABLE %s(id int primary key,money int(30))', TABLE_NAME)
    
    批量插入纪录
    values = []
    for i in range(20):
        values.append((int(i),int(156*i)))
    cursor.executemany('INSERT INTO bankData values(%s,%s)', values)
    conn.commit()
    
    查询数据条目
    count = cursor.execute('SELECT * FROM %s', TABLE_NAME)
    print ('total records:{}'.format(cursor.rowcount))
    
    获取表名信息
    desc = cursor.description
    print ('%s %3s' % (desc[0][0], desc[1][0]))
    
    cursor.scroll(10,mode=‘absolute’)
    results = cursor.fetchall()
    for result in results:
        print (result)

except:
    import traceback
    traceback.print_exc()
    
    # 发生错误时会滚
    conn.rollback()
finally:

    # 关闭游标连接
    cursor.close()
    
    # 关闭数据库连接
    conn.close()

构建系统

import pymysql


class TransferMoney(object):
    构造方法
    def init(self, conn):
        self.conn = conn
        self.cur = conn.cursor()
        
    def transfer(self, source_id, target_id, money):
        if not self.check_account_avaialbe(source_id):
            raise Exception('账户不存在')
        if not self.check_account_avaialbe(target_id):
            raise Exception('账户不存在')
        if self.has_enough_money(source_id, money):
            try:
                self.reduce_money(source_id, money)
                self.add_money(target_id, money)
            except Exception as e:
                print('转账失败:', e)
                self.conn.rollback()
        else:
            self.conn.commit()
            print('%s给%s转账%s金额成功' %(source_id, target_id, money))
    
    def check_account_avaialbe(self, acc_id):
        # 判断帐号是否存在, 传递的参数是银行卡号的id
        select_sqli = 'select * from bankData where id=%d;' % (acc_id)
        print('execute sql:', select_sqli)
        res_count = self.cur.execute(select_sqli)
        if res_count == 1:
            return True
        else:
            raise Exception('账户%s不存在' % (acc_id))
            return False
    
    def has_enough_money(self, acc_id, money):
        # 判断acc_id账户上金额> money
        
        # 查找acc_id存储金额?
        select_sqli = 'select money from bankData where id=%d;' % (acc_id)
        print('execute sql:', select_sqli)
        self.cur.execute(select_sqli)  # ((1, 500), )
    
        # 获取查询到的金额钱数;
        acc_money = self.cur.fetchone()[0]
    
        # 判断
        if acc_money >= money:
            return True
        else:
            return False
    
    def add_money(self, acc_id, money):
        update_sqli = 'update bankData set money=money+%d where id=%d' % (money, acc_id)
        print('add money:', update_sqli)
        self.cur.execute(update_sqli)
    
    def reduce_money(self, acc_id, money):
        update_sqli = 'update bankData set money=money-%d where id=%d' % (money, acc_id)
        print('reduce money:', update_sqli)
        self.cur.execute(update_sqli)
    
    析构方法
    def del(self):
        self.cur.close()
        self.conn.close()

if name == 'main':
    # 1. 连接数据库,
    conn = pymysql.connect(host = '127.0.0.1', # 连接名称,默认127.0.0.1 
                           user = 'root', # 用户名
                           passwd='password', # 密码
                           port= 3306, # 端口,默认为3306
                           db='test_3', # 数据库名称
                           charset='utf8',
                           autocommit=True, # 如果插入数据,自动提交给数据库 
                          )
    trans = TransferMoney(conn) 
    trans.transfer(15, 12, 200)
posted @ 2022-11-12 17:48  三省吾身~  阅读(120)  评论(0)    收藏  举报