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

######连接数据库(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()

- 添加表内容:

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()

 

- 批量添加:

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()

注意:

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()

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

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

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/houzeyu666/article/details/82493218