【问题标题】:NotImplementedError: executemany is implemented for simple INSERT statements onlyNotImplementedError:executemany 仅针对简单的 INSERT 语句实现
【发布时间】:2017-05-18 09:02:00
【问题描述】:

我尝试使用 sqlalchemy 通过 pandas 附加我的 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?
  • 你好。使用 sqlalchemy-vertica-python (0.1.3)login = {'vertica': {"sys":"vertica", "dri":"vertica_python", "database":"***", "user":"***", "password":"***", "host":"***", "port":"5433"}, }
  • 似乎 sqlalchemy-vertica-python 提供方言并使用 vertica-python 作为 DB-API。后者有Cursor.executemany() added about a month ago,所以也许你只需要升级。在(已关闭)issue about the missing method 中明确提到了 Pandas 支持。
  • 问题不在于 SQLAlchemy。 sqlalchemy-vertica-python 是一个第 3 方插件,而 vertica-python 是一个单独的 DB-API 库。您需要升级 vertica-python
  • 是的,问题出在此处。我收到新错误并更改描述。

标签: python-3.x pandas sqlalchemy vertica


【解决方案1】:

我在尝试使用 sqlalchemy 将数据写入 vertica 时遇到了同样的错误。就我而言,问题是列名。它似乎无法编写包含特殊字符的列名。我可以通过从 pandas 的列名中删除所有 '_'、'%' 和空格字符来修复错误,然后我使用 df.to_sql() 将其写入 vertica。

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多