专题03-python操作MySQL数据库

笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值,找寻数据的秘密,笔者认为,数据的价值不仅仅只体现在企业中,个人也可以体会到数据的魅力,用技术力量探索行为密码,让大数据助跑每一个人,欢迎直筒们关注我的公众号,大家一起讨论数据中的那些有趣的事情。

我的公众号为:livandata

        在平时训练数据库时,往往需要将数据导入到数据库中,更频繁的是将文件中的数据导入到数据库中,本文就将数据从csv文件中导入到mysql数据库中,同时实现一个读写数据库的案例——转账案例,来分析python使用数据库的过程。

1、从csv文件中读入数据并将其导入到数据库中:

#!/usr/bin/env python
# _*_ UTF-8 _*_
'''
@project:GBDT+LR-Demo
@author:xiaofei
'''
import pymysql
import pandas as pd
import sys

df_train = pd.read_csv('data/t_alibaba_data1.csv')
print(df_train.iloc[1]["user_id"])
# 打开数据库连接
db = pymysql.connect("localhost", "root", "123456", "recommond")
cursor = db.cursor()
for i in range(len(df_train)):
    sql = "insert into t_data_total(user_id, brand_id, type, visit_datetime) values('%s','%s','%s','%s')"
    cursor.execute(sql %(df_train.iloc[i]["user_id"],
                         df_train.iloc[i]["brand_id"],
                         df_train.iloc[i]["type"],
                         df_train.iloc[i]["visit_datetime"]))
db.commit()
print("finish~~")
db.close()

2、常见的一些语句为:

#创建数据表
cur.execute("create table if not EXISTS account(accid int(10) PRIMARY KEY ,money int(10))")
#插入两行数据
cur.execute('insert into account(accid,money) VALUES (1,110)')
cur.execute('insert into account(accid,money) VALUES (2,10)')
conn.commit()

3、转账功能需要用到的数据库操作:

# 转账问题
class TransferMoney(object):
    def __init__(self, conn):
        self.conn = conn
    def check_acct_available(self, accid):
        cursor = self.conn.cursor()
        try:
            sql = 'select * from account where accid=%s' % accid
            cursor.execute(sql)
            print('check_acct_available' + sql)
            rs = cursor.fetchall()
            if len(rs) != 1:
                raise Exception('账号%s 不存在' % accid)
        finally:
            cursor.close()
    def has_enough_money(self, accid, money):
        cursor = self.conn.cursor()
        try:
            sql = 'select * from account where accid=%s and money>%s' % (accid, money)
            cursor.execute(sql)
            print('check_money_available' + sql)
            rs = cursor.fetchall()
            if len(rs) != 1:
                raise Exception('账号%s 没有足够钱' % accid)
        finally:
            cursor.close()
    def reduce_money(self, accid, money):
        cursor = self.conn.cursor()
        try:
            sql = 'update account set money=money-%s where accid=%s' % (money, accid)
            cursor.execute(sql)
            print('reduce money' + sql)
            rs = cursor.fetchall()
            if cursor.rowcount != 1:
                raise Exception('账号%s 减款失败' % accid)
        finally:
            cursor.close()
    def add_money(self, accid, money):
        cursor = self.conn.cursor()
        try:
            sql = 'update account set money=money+%s where accid=%s' % (money, accid)
            cursor.execute(sql)
            print('reduce money' + sql)
            rs = cursor.fetchall()
            if cursor.rowcount != 1:
                raise Exception('账号%s 加款失败' % accid)
        finally:
            cursor.close()
    def transfer(self, source_accid, target_accid, money):
        ###检测两个账号是否可用
        try:
            self.check_acct_available(source_accid)
            self.check_acct_available(target_accid)
            ####检测付款人是否有足够的钱
            self.has_enough_money(source_accid, money)
            self.reduce_money(source_accid, money)
            self.add_money(target_accid, money)
            self.conn.commit()
        except Exception as e:
            self.conn.rollback()
            raise e
if __name__ == '__main__':
    source_accid = sys.argv[1]
    target_accid = sys.argv[2]
    money = sys.argv[3]
    conn = MySQLdb.connect(host='127.0.0.1', port=3306, user='root', passwd='199331', db='test', charset='utf8')
    tr_money = TransferMoney(conn)
    try:
        tr_money.transfer(source_accid, target_accid, money)
    except Exception as e:
        print('出现问题' + str(e))
    finally:
        conn.close()

以此做个记录,以方便数据库使用。

参考文献为:https://www.cnblogs.com/itdyb/p/5700614.html

发布了137 篇原创文章 · 获赞 93 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/livan1234/article/details/86544573
今日推荐