首页 > 解决方案 > 如何使用 ODBC 将 python 与 vertica 连接?

问题描述

import sqlalchemy as sa
conn = "vertica+pyodbc://dbadmin:password@VMart"
sa.create_engine(conn, pool_size=10, max_overflow=20)
%load_ext sql
%sql vertica+pyodbc://VMart

错误

(pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)')

(此错误的背景位于:http ://sqlalche.me/e/rvf5 )
SQLAlchemy 格式所需的连接信息,例如:

 postgresql://username:password@hostname/dbname<br>
           or an existing connection: dict_keys([])

第一的

import sqlalchemy as sa
import urllib
sa.create_engine('vertica+vertica_python://dbadmin:password@192.168.11.132:5433/VMart')
%load_ext sql
%sql vertica+pyodbc://VMart

第二

import sqlalchemy as sa
sa.create_engine('vertica+vertica_python://dbadmin:password@VMart')

import pyodbc

第三

conn = pyodbc.connect("DRIVER=Vertica;SERVER=192.168.11.132;DATABASE=VMart;PORT=5433;UID=dbadmin;PWD=password")

同样的错误

错误,但我已经在 windows10 中测试了 vertica odbc。连接成功

(pyodbc.InterfaceError) ('IM002', '[IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified (0) (SQLDriverConnect)') (此错误的背景位于:http:// /sqlalche.me/e/rvf5 )
SQLAlchemy 格式所需的连接信息,例如:

postgresql://username:password@hostname/dbname
或现有连接:dict_keys([])

标签: python-3.xsqlalchemyvertica

解决方案


可能无法找到问题的根源,但以下是一些有助于建立连接的步骤:

  1. 您是否尝试过安装sqlalchemy-vertica驱动程序?具体来说,我建议使用vertica-python. 这是在 python 中与 vertica 连接的一个驱动程序,我发现它工作得很好(稍后注意)
pip install sqlalchemy-vertica[vertica-python]
  1. 你进口了vertica-python吗?不确定这会影响代码,但它肯定有助于将其作为问题删除。如果您还没有安装它:
pip install vertica-python

编辑:事实上,如果你只需要读取数据,这个包对我来说效果很好。以下是目前为我工作的示例代码:

import vertica_python
conn_info = {
    'host': 'host-ip',
    'port': port,
    'user': 'usr',
    'password':password,
    'database': 'db',
    # autogenerated session label by default,
    'session_label': 'current_session',
    # default throw error on invalid UTF-8 results
    'unicode_error': 'strict',
    # SSL is disabled by default
    'ssl': False,
    # using server-side prepared statements is disabled by default
    'use_prepared_statements': False,
    # connection timeout is not enabled by default
    # 'connection_timeout': 1
}

vertica_python.connect(**conn_info)
  1. 建立联系。我建议您连接的第一条线路:
sa.create_engine('vertica+vertica_python://dbadmin:password@192.168.11.132:5433/VMart')

使用 Pandas 的注意事项

  1. 我在str使用pandas.to_sql. 如果这是您的情况,只需确保为这些列显式传递类型(由于某种原因VARCHAR它会强制)。此问题TEXT中的此功能可能会帮助您:
def updateType(df_para):
    dtypedict = {}  # create and empty dictionary
    for i,j in zip(df_para.columns, df_para.dtypes):
        if "object" in str(j):
            dtypedict.update({i: sa.types.VARCHAR})

    return dtypedict

updatedict = updateType(df)
  1. 使用时我会收到一个奇怪的错误to_sql

NotImplementedError:executemany 仅针对简单的 INSERT 语句实现。

没有找到合适的解决方案,但尝试使用chunksize参数对其进行修复,并且似乎有效。


推荐阅读