파이썬의 sqlite3에서 sql을 사용하여 데이터베이스에서 데이터를 열별로 꺼내는 함수를 만들어 보았다 [sqlite3 , sql ,pandas]

동기 부여



평상시 기계 학습계만 독학하고 있습니다만, twitter등에서는 sql의 지식도 필요라고 말해지는 분을 자주(잘) 봅니다. 그래서 조금씩 병행해서 배우자는 것으로, 처음에는 데이터를 꺼내는 곳에서 함수화해 가고 싶습니다.

이 기사에서는 다음을 수행합니다.
  • pandas dataframe을 db에 저장
  • 만든 db에서 column 지정으로 데이터를 꺼냅니다

  • 이미 있다면 죄송합니다.
    SQL은 완전 초보자이므로 많이 보아라 (-_-;)

    이번에 사용하는 것의 import


    import sqlite3
    import pandas as pd
    import pandas.io.sql as sql
    

    DB 만들기



    pandas를 사용하여 시험용 DB를 만듭니다.
    만드는 dataframe은 다음과 같이하고 싶습니다. 값은 적당합니다.

    city = ["tokyo","kyoto","oosaka"]
    num = [30,20,28]
    df_1 = pd.DataFrame({"city":city,"number_of_city":num})
    

    dataframe -> database로
    path = "tamesi.db"
    conn = sqlite3.connect(path)
    cur = conn.cursor()
    sql.to_sql(df_1,"study",conn,if_exists="replace",index=None)
    cur.close()
    con.close()
    

    이번에는 tamesi라는 데이터베이스에 study라는 테이블로 만들었습니다.

    지정된 열을 추출하는 함수 만들기



    만들었습니다.
    def ret_column(db,table,column=""):
        assert bool(column), "no column is spcified"
        conn= sqlite3.connect(db)
        cur = conn.cursor()
        cur.execute("select {} from {}".format(column,table))
        val = cur.fetchall()
        cur.close()
        conn.close()
        return val
    

    column에 꺼내고 싶은 것을 넣어 꺼냅니다. 일단 열에 아무것도 없으면 오류를 반환하려고했습니다.
    하는 것은 단순히 db와 table을 지정하고 sql 문을 호출하는 것입니다.

    모든 데이터를 검색하는 함수 만들기



    모처럼 왜 전체 데이터를 꺼내는 함수를 작성해 보겠습니다.
    만들었습니다.
    def ret_all(db,table):
        conn = sqlite3.connect(db)
        cur = conn.cursor()
        cur.execute("select * from {}".format(table))
        val = cur.fetchall()
        cur.close()
        conn.close()
        return val
    

    칼럼 지정이 없기 때문에 이쪽이 간단했습니다.

    사용해보기


    path = "tamesi.db"
    table="study"
    val_1 = ret_column(path,table,column="city")
    val_2 = ret_all(path,table)
    print(val_1)
    print(val_2)
    
    #以下出力
    [('tokyo',), ('kyoto',), ('oosaka',)]
    [('tokyo', 30), ('kyoto', 20), ('oosaka', 28)]
    

    제대로 꺼낼 수 있는 것을 확인할 수 있었습니다.

    드디어 인스턴스화해보자



    간단하게 class로 구현해 보았습니다.
    class ret_from_db():
        def __init__(self,db):
            self.db = db
    
        def ret_column(self,table,column=""):
            assert bool(column), "no column is spcified"
            conn= sqlite3.connect(self.db)
            cur = conn.cursor()
            cur.execute("select {} from {}".format(column,table))
            val = cur.fetchall()
            cur.close()
            conn.close()
            return val
    
        def ret_all(self,table):
            conn = sqlite3.connect(self.db)
            cur = conn.cursor()
            cur.execute("select * from {}".format(table))
            val = cur.fetchall()
            cur.close()
            conn.close()
            return val
    

    위 두 개를 붙였을 뿐입니다, 특필은 없음.

    사용해 보았습니다.
    get_db = ret_from_db(db="tamesi.db")
    val_1 = get_db.ret_column(table="study",column="city")
    val_2 = get_db.ret_all(table="study")
    print(val_1)
    print(val_2)
    
    #以下出力
    [('tokyo',), ('kyoto',), ('oosaka',)]
    [('tokyo', 30), ('kyoto', 20), ('oosaka', 28)]
    

    제대로 할 수 있었습니다.



    이것이 실용성이 있을지 어떨지 모릅니다 사용하지 않는 것이므로(-_-;)
    다음은 pandas로 읽을 수 있으면 sklean등에 사용하기 쉬워지기 때문에 그것을 만들고 싶네요.

    좋은 웹페이지 즐겨찾기