2017-10-12 6 views
0

MySQL 데이터베이스의 데이터를 Python의 odo 라이브러리를 사용하여 Pandas 데이터 프레임으로 가져와야합니다. Odo의 문서에서는 데이터를 가져 오기 위해 테이블 ​​이름을 전달하는 방법에 대한 정보 만 제공하지만 데이터베이스에서 필요한 데이터를 가져 오는 SQL 쿼리 문자열은 어떻게 전달합니까?Python의 odo 라이브러리를 사용하여 mysql 데이터베이스에서 데이터를 가져옵니다.

다음 코드는 작동 :

수입 PD 등의 수입 팬더

오도

데이터 = 오도 ('MySQL의 + pymysql : // 사용자 이름 : {0} @ localhost를/DBNAME :: { 1} '형식 ('암호 ','테이블 이름 '), pd.DataFrame)

그러나 어떻게 테이블 이름 대신 SQL 문자열을 전달합니까? 필요한 데이터를 가져 오기 위해 여러 개의 다른 테이블을 조인해야하기 때문에.

답변

0

문자열을 odo에 직접 전달하는 것은 모듈에서 지원되지 않습니다. 나열된 도구를 사용하여 데이터를 이동하는 데는 세 가지 방법이 있습니다.

첫째, 사용하여 문자열로 SQL 쿼리를 작성하고 읽어

data = pandas.read_sql_query(sql, con, index_col=None, 
          coerce_float=True, params=None, 
          parse_dates=None, chunksize=None)[source] 

심판 http://pandas.pydata.org/pandas-docs/version/0.20/generated/pandas.read_sql_query.html#pandas.read_sql_query

둘째, ODO 방법을 사용하는 것은 다음 오도에 사전을 사용하여 사전에 쿼리를 실행해야합니다 (소스, 목적지) 구조.

cursor.execute(sql) 
results = db.engine.execute(sql) 

data = odo(results, pd.DataFrame) 

심판 PG 30 REF How to execute raw SQL in SQLAlchemy-flask app

REF cursor.fetchall() vs list(cursor) in Python

마지막

https://media.readthedocs.org/pdf/odo/latest/odo.pdf의이 결과의 각 결과의 팬더 데이터 프레임을 추가 고려 실행 속도를 증가시키기 위해.

result = db.engine.execute(sql).fetchone() 

data = pd.DataFrame(index=index, columns=list('AB')) 
data = df_.fillna(0) # with 0s rather than NaNs 

while result is not None: 
    dataappend = pd.DataFrame(result, columns=list('AB')) 
    data.append(dataappend) 
    result = db.engine.execute(sql).fetchone() 

심판 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html

심판 Creating an empty Pandas DataFrame, then filling it?

+0

감사하지만 팬더를 사용하여 데이터베이스 데이터를 읽고는 ODO에 비해 느립니다. ODO 메서드에 SQL 문자열을 전달할 수있는 방법이 있습니까? – user2714753

+0

ODO 방법은 문서가 가리키는대로 쿼리하지 않습니다. (소스, 대상) 구조를 사용하려면 편집 된 대답에 설명 된대로 사전을 전달해야합니다. – brddawg