NotImplementedError: executemany仅适用于简单的INSERT语句。

7

我尝试通过pandas和sqlalchemy将我的vertica(SQL类型)表附加到数据库中。

import pandas as pd
import sqlalchemy as sa

创建适用于Vertica的引擎:

def get_engine(base):
    engine = sa.create_engine("{sys}+{dri}://{user}:" + \
                               "{password}@{host}:{port}/{database}".format(**login[base]))
    return engine
engine = get_engine('vertica')

为了更清晰地理解,这是一个简单的查询:

table = '***'

sql =\
'''
select *
from public.{table}
'''.format(table=table)

connection = engine.connect()
data = pd.read_sql(sql, connection)
connection.close()

数据不为空:

print(len(data))
569955

并尝试写入相同的表:

fields = list(data.columns)
connection = engine.connect()
data.to_sql(table, connection, schema='public', index=False, if_exists='append', chunksize=30000,
            dtype={fields[0]:sa.types.Integer,
            fields[1]:sa.types.VARCHAR,
            fields[2]:sa.types.Integer,
            fields[3]:sa.types.Integer,
            fields[4]:sa.types.Integer,
            fields[5]:sa.types.VARCHAR,
            fields[6]:sa.types.VARCHAR,
            fields[7]:sa.types.VARCHAR,
            fields[8]:sa.types.VARCHAR,
            fields[9]:sa.types.VARCHAR,
            fields[10]:sa.types.VARCHAR,
            fields[11]:sa.types.VARCHAR,
            fields[12]:sa.types.DateTime
           })
connection.close()

并解决这个错误:

...
\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py in do_executemany(self, cursor, statement, parameters, context)
    465 
    466     def do_executemany(self, cursor, statement, parameters, context=None):
--> 467         cursor.executemany(statement, parameters)
    468 
    469     def do_execute(self, cursor, statement, parameters, context=None):

\Anaconda3\lib\site-packages\vertica_python\vertica\cursor.py in executemany(self, operation, seq_of_parameters)
    153         else:
    154             raise NotImplementedError(
--> 155                 "executemany is implemented for simple INSERT statements only")
    156 
    157     def fetchone(self):

NotImplementedError: executemany is implemented for simple INSERT statements only

什么数据库,什么DB-API驱动程序?换句话说,login['vertica']['sys']login['vertica']['dri']是什么?不熟悉Vertica,因此希望它们被明确提到。可能是vertica+pyodbc吗? - Ilja Everilä
你好。使用 **sqlalchemy-vertica-python (0.1.3)**: login = {'vertica': {"sys":"vertica", "dri":"vertica_python", "database":"***", "user":"***", "password":"***", "host":"***", "port":"5433"}, } - Ivan Savin
似乎sqlalchemy-vertica-python提供方言并使用vertica-python作为DB-API。后者在大约一个月前添加了Cursor.executemany(),所以也许您只需要升级。Pandas支持明确提到在(关闭的)关于缺失方法的问题中。 - Ilja Everilä
问题不在于SQLAlchemy。sqlalchemy-vertica-python是第三方插件,而vertica-python是一个独立的DB-API库。您需要升级vertica-python - Ilja Everilä
是的,问题就在这里。我已经得到了新的错误并更改了描述。 - Ivan Savin
@IvanSavin,你弄清楚了vertica_python的哪个版本可用了吗? - lv10
1个回答

4

在使用SQLAlchemy将数据写入Vertica时,我遇到了相同的错误。针对我的情况,问题出在列名上。似乎无法写入包含特殊字符的列名。我可以通过从pandas中删除所有下划线、百分号和空格字符的列名来解决这个错误,然后使用df.to_sql()将其写入Vertica。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接