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