python下的数据库管理

一. 搭建管理环境
mysql主机:
1. 创建一个可以远程登陆的用户;
2. 给这个用户授权, 可以对哪个数据库操作;
3. 看防火墙是否关闭;

python3主机:
1. 测试是否可以成功连接mysql主机?
2. 修改pycharm的解释器(安装pymysql模块)位置, 编写mysql代码,

1.创建虚拟环境并激活
这里写图片描述
这里写图片描述
2.安装pymysql,为了能在pycharm中管理数据库
这里写图片描述
查看虚拟环境中的解释器位置:
进入安装过程中environment location后边的目录下的bin目录
这里写图片描述
这里写图片描述
4.在pycharm中修改解释器为上边目录下的python3.6
这里写图片描述

二.pycharm中数据库管理操作

1.框架

imort pymysql   ##导入pymysql模块
##1.连接数据库
##host='要管理的数据库所在的ip',user='该数据库所属的用户',password='数据库密码',charset='支持的编码格式',autocommit=True(自动提交对数据库的操作,也就是在pycharm中的操作,数据库中可以看到)
conn = pymysql.connect(host='172.25.254.30',user='root',password='forever',charset='utf8',autocommit=True)

##2.创建一个游标,用来给数据库发送sql语句的;
cur = conn.cursor()

##3.选择需要操作的数据库
conn.select_db('westos')##此命令可以加在连接数据库语句的后面,改为db='westos'

##要执行的sql
create_sql = 'create table westosuser(名字 varchar(10) not null ,年龄 int not null);'
cur.execute(create_sql)

# 4.先关闭游标
cur.close()

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

2.一些详细操作

1.自动提交所有对数据库的操作
1)在连接数据库操作的最后面加入autocommit=True
这里写图片描述
2)在要操作的语句后面加上,conn.commit()
这里写图片描述
2.创建一个表

create_sql = 'create table westosuser(名字 varchar(10) not null ,年龄 int not null);'
cur.execute(create_sql)
##cur.execute('create table westosuser(名字 varchar(10) not null ,年龄 int not null);')

3.
1)向表中插入一组数据

cur.execute("insert into westosuser values ('user1',123)";) ##一组数据

2)向表中插入多组数据executmany

users = [('user'+str(i), i) for i in range(100)]
insert_sqli = 'insert into westosuser VALUES (%s, %s);'
cur.executemany(insert_sqli, users)


###想通过select方式查看表中的内容发现打印出的是表中的数据的个数
select_sqli = 'select * from westosuser;'
res = cur.execute(select_sqli)
print("查看语句的返回结果:", res)

这里写图片描述

4.查看表中的数据
1)cur.fetchone类似与文件的操作f.readline, 每次只读取一条记录;

print("查找一条记录:", cur.fetchone())
print("查找一条记录:", cur.fetchone())
print("查找一条记录:", cur.fetchone())

这里写图片描述

2)cur.fetchmany, 类似于f.readlines, 返回的是一个元组;

print("查找5条记录:", cur.fetchmany(5))  ###fetchmany(),()内填的是想查看数据的个数

这里写图片描述
3) cur.fetchall返回的是一个元组;
这里写图片描述

5.移动游标的位置

###执行下边命令时,我们会发现第二条语句的开始接着上一条结果继续
print("查找5条记录:",cur.fetchmany(5))
print("查找所有记录", cur.fetchall())

这里写图片描述

1)移动游标的位置, 到记录的最开始

print("查找5条记录:",cur.fetchmany(5))
cur.scroll(0, mode='absolute')   ###移动游标的位置, 到记录的最开始
print("查找所有记录", cur.fetchall())

这里写图片描述

2)移动游标到一个相对位置

##在执行完第一条语句后,游标又向后移动了10下,所以第二次从15开始
print("查找5条记录:",cur.fetchmany(5))
cur.scroll(10, mode='relative')  ###这里的10是向后移动的个数,如果是负数,向前方移动
print("查找2所有记录", cur.fetchall())

这里写图片描述

###完整程序
import pymysql
conn = pymysql.connect(host='172.25.254.77',user='root',password='forever',charset='utf8',autocommit=True,db='westos')
cur=conn.cursor()
users = [('user'+str(i), i) for i in range(100)]
insert_sqli = 'insert into westosuser VALUES (%s, %s);'
cur.executemany(insert_sqli, users)
select_sqli = 'select * from westosuser;'
res = cur.execute(select_sqli)
print("查看语句的返回结果:", res)
print("查找5条记录:",cur.fetchmany(5))
cur.scroll(-1, mode='relative')
print("查找所有记录", cur.fetchall())
cur.close()
conn.close()

3.获取子段名和表的详细信息

import pymysql
conn = pymysql.connect(host='172.25.254.77',user='root',password='forever',
                       charset='utf8',autocommit=True,db='westos')
cur = conn.cursor()
# 显示有多少行记录?
res = cur.execute('select * from westosuser;')
print('%s行' %(res))

# 显示每列的详细信息
desc = cur.description
print("表的描述:",desc )

 # 获取表头
print("表头", ",".join([item[0] for item in desc]))

cur.close()

这里写图片描述

三.练习

1.银行转账操作系统

import pymysql

class TransferMoney(object):
    def __init__(self, conn):
        self.conn = conn
        self.cursor = conn.cursor()

    def transfer(self, source_accid, target_accid, money):
        """
        转账方法:
            # 1. source_accid帐号是否存在;
            # 2. target_accid帐号是否存在;
            # 3. 是否有足够的钱
            # 4. source_accid扣钱
            # 5. target_acci加钱
            # 6. 提交对数据库的操作
        :param source_accid: 源帐号id
        :param target_accid: 目标帐号id
        :param money: 转账金额
        :return: bool
        """
        # 判断帐号是否存在
        self.check_account_avaiable(source_accid)
        self.check_account_avaiable(target_accid)

        # 是否有足够的钱
        self.has_enough_money(source_accid, money)


        try:
            # source_accid扣钱
            self.reduce_money(source_accid, money)
            print('a')
            #  target_acci加钱
            self.add_money(target_accid, money)
            self.conn.commit()
        except Exception as e:
            # ********************撤销对于数据库的更改操作, 回滚******************
            self.conn.rollback()
        else:
            print("%s给%s转账%s成功" %(source_accid, target_accid, money))




    def check_account_avaiable(self, accid):
        """判断帐号是否存在, 传递参数为帐号id"""
        #
        select_sqli = 'select * from bankData where id=%s' %(accid)
        print("execute sql:", select_sqli)
        res = self.cursor.execute(select_sqli)
        # 判断是否能找到帐号为accid的记录;
        if res == 1:
            return  True
        else:
            raise  Exception("帐号%s不存在" %(accid))


    def has_enough_money(self, accid, money):
        """是否有足够的钱"""
        select_sqli = 'select money from bankData where id=%s' %(accid)
        print('execute sql:', select_sqli)
        self.cursor.execute(select_sqli)

        # 获取查询到的金钱数额
        acc_money = self.cursor.fetchone()[0]
        print(acc_money, type(acc_money))

        # 判断
        if acc_money >= money:
            return  True
        else:
            raise  Exception("账户%s没有足够的金额, 当前余额为%s" %(accid, acc_money))


    def reduce_money(self, accid, money):
        # 对于accid减少的金额为money
        try:
            update_sqli = 'update bankData set money=money-%s where id="%s"' %(money, accid)
            print("redcue_money sql:", update_sqli)
            self.cursor.execute(update_sqli)
        except Exception as e:
            print('Error:',e)

    def add_money(self, accid, money):
        # 对于accid减少的金额为money
        try:
            update_sqli = 'update bankData set money=money+%s where id="%s"' %(money, accid)
            print("add_money sql:", update_sqli)
            self.cursor.execute(update_sqli)
        except Exception as e:
            print('Error:',e)

    def __del__(self):
        # 当删除对象时, 自动执行, 关闭游标;
        self.cursor.close()



if __name__ == '__main__':
    conn = pymysql.connect(host='172.25.254.77', user='root',
                               password='forever', charset='utf8',
                               db='westos1')

    trans = TransferMoney(conn)
    trans.transfer('610003', '610002', 100)

def create_data():
    # 1. 连接数据库, host, user, passwd, charset
    conn = pymysql.connect(host='172.25.254.77', user='root',
                           password='forever', charset='utf8',
                           autocommit=True, db='westos1')
    # 2. 创建一个游标, 用来给数据库发送sql语句的;
    cur = conn.cursor()

    # 3. 创建一个表
    try:
        create_sqli = 'create table bankData( id int PRIMARY KEY, name varchar(10), money FLOAT);'
        cur.execute(create_sqli)
    except Exception as e:
        print("Error: 表已经创建", e)
    else:
        print("表创建成功")
    #4. 创建数据
    try:
        users = [(610001, '张三', 1000), (610002, '李四', 1000),(610003, '粉条', 1000)]
        insert_sqli = 'insert into bankData VALUES (%s, %s, %s);'
        cur.executemany(insert_sqli, users)
    except Exception as e:
        print('Error:', e)
    else:
        print("初始化数据成功!")
    # 4. 先关闭游标
    cur.close()

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

猜你喜欢

转载自blog.csdn.net/forever_wen/article/details/82222929
今日推荐