2017年10月22日日曜日

CSVファイルをPostgreSQLデータベースに書込む

CSVファイルの入出力にはpandasが便利!

CSVファイルはEXCELから吐き出すこともできるので、データベースへの書込みはこのルートでほとんど賄えます。

CSVファイルの内容


2017-10-10,1.,Almost Like Praying (feat. Artists for Puerto Rico),Lin-Manuel Miranda
2017-10-10,2.,Thunder,Imagine Dragons
2017-10-10,3.,Feel It Still,Portugal. The Man
2017-10-10,4.,Perfect,Ed Sheeran
2017-10-10,5.,Look What You Made Me Do,Taylor Swift

    

今回はデータベースにpostgreSQLを使用して、postgreSQLとのインターフェースにはpsycopg2を使っています。SQLを作る2つの関数とそのSQLを実行する2つの関数で構成し、CSVファイルの読み込みはpandasのread_csv関数を使って1行で達成してます。



import psycopg2,sys
import pandas as pd

def SQL_createTable() :
    
    sql = 'CREATE TABLE itunes'
    sql = sql + '(date DATE,'  
    sql = sql + 'rank SMALLINT,'
    sql = sql + 'song VARCHAR(100),'
    sql = sql + 'artist VARCHAR(30));'
    
    return sql

def SQL_insertTable() :
    
    sql = 'INSERT INTO itunes ('
    sql = sql + 'date,'  
    sql = sql + 'rank,'
    sql = sql + 'song,'
    sql = sql + 'artist)'
    sql = sql + ' VALUES (%s,%s,%s,%s);'
    
    return sql


def initial_DB(SQL) :    
    try :        
        conn = psycopg2.connect(database="ddddd", user="uuuuu", password="xxxxx", host="127.0.0.1", port="0000")    
        cur = conn.cursor()
        cur.execute(SQL)
        conn.commit()        
    except psycopg2.OperationalError as e:        
        print('Unable to connect!\n{0}').format(e)
        sys.exit(1)    
    finally:
        if conn:
            conn.close()
            
def csv2DB(SQL,csvDF) :    
    try :        
        conn = psycopg2.connect(database="ddddd", user="uuuuu", password="xxxxx", host="127.0.0.1", port="0000")    
        for index in range(len(csvDF)) :
            cur = conn.cursor()
            cur.execute(SQL,(
                    csvDF.at[index,'date'],
                    csvDF.at[index,'rank'],
                    csvDF.at[index,'song'],
                    csvDF.at[index,'artist']))
            conn.commit()
    except psycopg2.OperationalError as e:
        print('Unable to connect!\n{0}').format(e)
        sys.exit(1)
    finally:
        if conn:
            conn.close()

if __name__ == '__main__':

    createTable = True
    if createTable :
        SQL = SQL_createTable()
        initial_DB(SQL)
    csvDF = pd.read_csv('csv/file.csv',sep=',',names =('date','rank','song','artist'))    
    SQL = SQL_insertTable()
    csv2DB(SQL,csvDF)
    

    


データベースに蓄積された内容は以下の通り。



postgresql => select * from itunes ;
    date    | rank |                        song                         |       artist
------------+------+-----------------------------------------------------+--------------------
 2017-10-10 |    1 | Almost Like Praying (feat. Artists for Puerto Rico) | Lin-Manuel Miranda
 2017-10-10 |    2 | Thunder                                             | Imagine Dragons
 2017-10-10 |    3 | Feel It Still                                       | Portugal. The Man
 2017-10-10 |    4 | Perfect                                             | Ed Sheeran
 2017-10-10 |    5 | Look What You Made Me Do                            | Taylor Swift
(5 行)


project_1=>