簡體   English   中英

在exasol中具有to_sql(),SQLAlchemy和架構的python pandas

[英]python pandas with to_sql() , SQLAlchemy and schema in exasol

我正在嘗試將熊貓數據框上傳到SQL表。 在我看來,pandas to_sql函數是較大數據幀的最佳解決方案,但我無法使其正常工作。 我可以輕松提取數據,但是在嘗試將其寫入新表時收到錯誤消息:

# connect to Exasol DB
exaString='DSN=exa'
conDB = pyodbc.connect(exaString)   

# get some data from somewhere, works without error
sqlString = "SELECT * FROM SOMETABLE"
data = pd.read_sql(sqlString, conDB)

# now upload this data to a new table
data.to_sql('MYTABLENAME', conDB, flavor='mysql')

conDB.close()

我收到的錯誤消息是

pyodbc.ProgrammingError :(“ 42000”,“ [42000] [EXASOL] [EXASolution驅動程序]語法錯誤,意外的identifier_chain2,期望的assignment_operator或':'[第1行,第6列](-1)(SQLExecDirectW)”)

不幸的是,我不知道導致此語法錯誤的查詢是什么樣的,否則還有其他錯誤。 有人可以指出正確的方向嗎?

(第二)編輯:

按照Humayuns和Joris的建議,我現在將Pandas版本0.14和SQLAlchemy與Exasol方言(?)結合使用。 由於我正在連接到已定義的架構,因此我在使用meta data選項,但是該程序因“ Bus error(core dumped)”而崩潰。

engine = create_engine('exa+pyodbc://uid:passwd@exa/mySchemaName', echo=True)    

# get some data
sqlString = "SELECT * FROM SOMETABLE"    # SOMETABLE is a view in mySchemaName 
df = pd.read_sql(sqlString, con=engine)  # works

print engine.has_table('MYTABLENAME')    # MYTABLENAME is a view in mySchemaName
# prints "True"

# upload it to a new table
meta = sqlalchemy.MetaData(engine, schema='mySchemaName')
meta.reflect(engine, schema='mySchemaName')
pdsql = sql.PandasSQLAlchemy(engine, meta=meta)
pdsql.to_sql(df, 'MYTABLENAME')

我不確定在create_engine(..)中設置“ mySchemaName”,但結果是相同的。

Pandas不支持現成的EXASOL語法,因此需要稍作更改,這是不帶SQLAlchemy的代碼的有效示例:

import pyodbc
import pandas as pd

con = pyodbc.connect('DSN=EXA')
con.execute('OPEN SCHEMA TEST2')

# configure pandas to understand EXASOL as mysql flavor
pd.io.sql._SQL_TYPES['int']['mysql'] = 'INT'
pd.io.sql._SQL_SYMB['mysql']['br_l'] = ''
pd.io.sql._SQL_SYMB['mysql']['br_r'] = ''
pd.io.sql._SQL_SYMB['mysql']['wld'] = '?'
pd.io.sql.PandasSQLLegacy.has_table = \
    lambda self, name: name.upper() in [t[0].upper() for t in con.execute('SELECT table_name FROM cat').fetchall()]

data = pd.read_sql('SELECT * FROM services', con)
data.to_sql('SERVICES2', con, flavor = 'mysql', index = False)

如果您使用EXASolution Python軟件包,則代碼如下所示:

import exasol
con = exasol.connect(dsn='EXA') # normal pyodbc connection with additional functions
con.execute('OPEN SCHEMA TEST2')

data = con.readData('SELECT * FROM services') # pandas data frame per default
con.writeData(data, table = 'services2')

問題在於,在pandas 0.14中,read_sql和to_sql函數也無法處理架構,但是在沒有架構的情況下使用exasol毫無意義。 固定為0.15。 如果現在要使用它,請查看此拉取請求https://github.com/pydata/pandas/pull/7952

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM