用python实现基本数据库操作(csv文件写入数据库,基于impala)
初来乍到,最近在数据服务部实习,想把学到的一些知识在博客上记录下来,这里我使用的数据库是impala,如果改成mySQL数据库也是一样的。
客户端连接数据库
def connect(self):
"""连接数据库和客户端"""
engine = create_engine('impala://{}:{}/{}'.format(self.host, self.port, self.database))
self.con = engine.connect()
向数据库中写入数据
def writetoSQL(self, file):
"""向数据库中写入数据"""
targetfile = file
data = pd.read_csv(targetfile, names=['name', 'age', 'contact'], header=0)
data.to_sql(name='teacher', con=self.con, if_exists='append', index=False)
主函数
if __name__ == "__main__":
filename = './test.csv'
writer = WriteToDb('169.169.171.88', '21050', 'first_db')
writer.connect()
writer.writetoSQL(filename)
以下是将上述代码封装后的文件
我将连接、读取的两个方法封装在了一个类中,放在了下面这个模块中:
commonFunc.py
import pandas as pd
from sqlalchemy import create_engine
class WriteToDb(object):
def __init__(self, hostname, port, database):
self.host = hostname
self.port = port
self.database = database
def connect(self):
"""连接数据库和客户端"""
engine = create_engine('impala://{}:{}/{}'.format(self.host, self.port, self.database))
self.con = engine.connect()
# return self.con
def writetoSQL(self, file):
"""向数据库中写入数据"""
targetfile = file
data = pd.read_csv(targetfile, names=['name', 'age', 'contact'], header=0)
data.to_sql(name='teacher', con=self.con, if_exists='append', index=False)
我将主函数放在了另一个包的模块中,这里实现了一个跨包的调用:
writeSQL.py
from util.commonFunc import WriteToDb
if __name__ == "__main__":
filename = './test.csv'
writer = WriteToDb('169.169.171.88', '21050', 'first_db')
writer.connect()
writer.writetoSQL(filename)
结果测试
我在’test.csv’文件中加入了几行数据,然后运行这个项目,可以成功将csv文件中的数据写入impala数据库:
首先我用这个函数向csv文件中添加两行数据:
writetoCSV.py
import csv
def writetoCSV(file):
targetfile = file
with open(targetfile, 'w', newline='') as outcsv:
fieldnames = ['name', 'age', 'contact']
writer = csv.DictWriter(outcsv, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'name': 'ouyangnana', 'age':20})
writer.writerow({'name': 'penglei','age': 30})
writetoCSV('./test.csv')
可以看到test.csv中已经加入了这两行数据:
运行主函数文件,可以看到数据库中也加上了这两行数据: