欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python下连接数据库(mysql)的操作及应用

程序员文章站 2022-05-18 09:28:14
...

######连接数据库(mysql)的操作及应用######

 

 

 

## 在pycharm下连接数据库的操作

 

## 连接数据库的方法

- 创建连接时指定本地用户连接:

    import pymysql

    pymysql.connect ( user='hello', password='hello', charset=utf8, autocommit=Ture )

- 创建连接时其它主机用户连接L

    import pymysql

    pymysql.connect(host="IP", user='hello', password='hello', charset=utf8, autocommit=Ture )

- 注:

    charset=utf8设置其编码格式,在新建表时可以输入中文,autocommit=Ture自动提交对数据库的操作(conn.commit()).

 

## 下面我们在pycharm上对数据库进行操作:

import pymysql

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

import pymysql

conn = pymysql.connect(user='hello', password='hello', charset='utf8', autocommit=True)
# 创建一个游标, 用来给数据库发送sql语句
cur = conn.cursor()
# 对于数据库实现增删改查操作
conn.select_db('houzeyu')
# 创建表
try:
    createTable = 'create table myusers (name varchar(20) not null, age int not null);'
    cur.execute(createTable)
    pass
except Exception as e:
    print('Fail', e)
else:
    print('success')
#关闭游标
cur.close()
#关闭数据库连接
conn.close()

Python下连接数据库(mysql)的操作及应用

- 添加表内容:

import pymysql

conn = pymysql.connect(user='hello', password='hello', charset='utf8', autocommit=True)
# 创建一个游标, 用来给数据库发送sql语句
cur = conn.cursor()
# 对于数据库实现增删改查操作
conn.select_db('houzeyu')
# 创建表
try:
    # createTable = 'create table myusers (name varchar(20) not null, age int not null);'
    # cur.execute(createTable)
    insert1 = 'insert into myusers values("user1", 101);'
    insert2 = 'insert into myusers values("user2", 102);'
    cur.execute(insert1)
    cur.execute(insert2)
    pass
except Exception as e:
    print('Fail', e)
else:
    print('success')
#关闭游标
cur.close()
#关闭数据库连接
conn.close()

 Python下连接数据库(mysql)的操作及应用

- 批量添加:

import pymysql

conn = pymysql.connect(user='hello', password='hello', charset='utf8', autocommit=True)
# 创建一个游标, 用来给数据库发送sql语句
cur = conn.cursor()
# 对于数据库实现增删改查操作
conn.select_db('houzeyu')
# 创建表
try:
    users = [('user'+str(i), '30') for i in range(20)]
    insert_add = 'insert into myusers values(%s,%s);'
    cur.executemany(insert_add, users)
    select = 'select * from myusers;'
    res=cur.execute(select)
    print(res)
    pass
except Exception as e:
    print('Fail', e)
else:
    print('success')
#关闭游标
cur.close()
#关闭数据库连接
conn.close()

Python下连接数据库(mysql)的操作及应用

注意:

select = 'select * from myusers;'
res=cur.execute(select)
print(res)

其返回值打印出的结果其实是表中统计用户的数量,而非用户信息

 

- 如何查看用户信息如下:

import pymysql

conn = pymysql.connect(user='hello', password='hello', charset='utf8', autocommit=True)
# 创建一个游标, 用来给数据库发送sql语句
cur = conn.cursor()
# 对于数据库实现增删改查操作
conn.select_db('houzeyu')
# 创建表
try:
    select = 'select * from myusers;'
    res=cur.execute(select)
    print(res)
    # 查看查看表中的数据
    #  cur.fetchone类似与文件的操作f.readline, 每次只读取一条记录;
    print(cur.fetchone())
    print(cur.fetchone())
    print(cur.fetchone())
    pass
except Exception as e:
    print('Fail', e)
else:
    print('success')
#关闭游标
cur.close()
#关闭数据库连接
conn.close()

Python下连接数据库(mysql)的操作及应用

# cur.fetchmany, 类似于f.readlines, 返回的是一个元组;
print("查找5条记录:",cur.fetchmany(5))

Python下连接数据库(mysql)的操作及应用

 

# 移动游标的位置, 到记录的最开始
cur.scroll(0, mode='absolute')
# cur.fetchall返回的是一个元组;
print("查找1所有记录", cur.fetchall())
cur.scroll(-10, mode='relative')
print("查找2所有记录", cur.fetchall())

Python下连接数据库(mysql)的操作及应用

 

 

## 获取表的字段名和信息:

res = cur.execute('select * from myusers;')
# 显示每列的详细信息
desc= cur.description
print("表的描述", desc)
# 获取表头
print("表头", ','.join([item[0] for item in desc]))

Python下连接数据库(mysql)的操作及应用

 

 

## 应用---银行转账操作

 

"""
 转账方法:
            # 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
"""

import pymysql


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

    def transfer(self, source_accid, target_accid, money):
        self.check_account(source_accid)
        self.check_account(target_accid)
        self.enough_money(source_accid, money)
        try:
            self.reduce_money(source_accid, money)
            self.add_money(target_accid, money)
            self.conn.commit()
        except Exception as e:
            # 撤销对于数据库的更改操作, 回滚
            self.conn.rollback()
        else:
            print("%s to %s 转账%s成功" % (source_accid, target_accid, money))

    def check_account(self, accid):
        """判断帐号是否存在, 传递参数为帐号id"""
        select_id = 'select * from bank where accid="%s"' % (accid)
        res = self.cursor.execute(select_id)
        if res == 1:
            return True
        else:
            raise Exception("没有找到账户")

    def enough_money(self, accid, money):
        """是否有足够的钱"""
        select_money = 'select money from bank where accid="%s"' % (accid)
        self.cursor.execute(select_money)
        # 获取查询到的金钱数额
        acc_money = self.cursor.fetchone()[0]
        if acc_money >= money:
            return True
        else:
            raise Exception('没有足够的钱')

    def reduce_money(self, accid, money):
        try:
            update_money = 'update bank set money=money-%s where accid="%s"' % (money, accid)
            print("update_money:", update_money)
            self.cursor.execute(update_money)
        except Exception as e:
            print('error', e)

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

    def __del__(self):
        self.cursor.close()


def create_data():
    conn = pymysql.connect(user='hello', password='hello', charset='utf8', db='houzeyu')
    cur = conn.cursor()
    try:
        create_sqli = 'create table bank( accid int PRIMARY KEY, ' \
                      'name varchar(10), money FLOAT);'
        cur.execute(create_sqli)
    except Exception as e:
        print('error', e)
    else:
        print('创建表成功')

    try:
        users = [(610001, 'kobe', 1000), (610002, 'james', 1000), (610003, 'curry', 1000)]
        insert = 'insert into bank values (%s,%s,%s)'
        cur.executemany(insert, users)
    except Exception as e:
        print('error', e)
    else:
        print('初始化数据成功')

    cur.close()
    conn.close()

create_data()
a = TransferMoney(conn=pymysql.connect(user='hello', password='hello', charset='utf8', autocommit=True, db='houzeyu'))
a.transfer(610001, 610002, 200)

 

 

 

 

###################################