【问题标题】:Connecting to Vertica database using SQLAlchemy使用 SQLAlchemy 连接到 Vertica 数据库
【发布时间】:2016-04-29 23:58:47
【问题描述】:

我正在尝试使用 SQLAlchemy 连接到 Vertica 数据库。

我偶然发现并在https://github.com/jamescasbon/vertica-sqlalchemy 安装了一个 Vertica 方言。我还安装了pyodbc。

使用http://www.pythoncentral.io/sqlalchemy-orm-examples/ 的基本教程,我有以下代码 sn-p :-

from sqlalchemy import Column, DateTime, String, Integer, ForeignKey, func
from sqlalchemy.orm import relationship, backref
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class Department(Base):
    __tablename__ = 'department'
    id = Column(Integer, primary_key=True)
    name = Column(String)

engine = create_engine(sa.engine.url.URL(drivername='vertica+pyodbc',
       username='<username>',password='<password>',
       host='<host>',database='<db name>',))


session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)

当它运行时,我会得到回溯:-

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/schema.py", line 3291, in    create_all
tables=tables)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1546, in _run_visitor
with self._optional_conn_ctx_manager(connection) as conn:
File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
return self.gen.next()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1539, in    _optional_conn_ctx_manager
with self.contextual_connect() as conn:
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1729, in contextual_connect
self.pool.connect(),
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 332, in connect
return _ConnectionFairy._checkout(self)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 626, in _checkout
fairy = _ConnectionRecord.checkout(pool)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 433, in checkout
rec = pool._do_get()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 945, in _do_get
return self._create_connection()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 278, in _create_connection
return _ConnectionRecord(self)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 404, in __init__
self.connection = self.__connect()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 527, in __connect
connection = self.__pool._creator()
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/strategies.py", line 95, in connect
connection_invalidated=invalidated
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 185, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/strategies.py", line 89, in connect
return dialect.connect(*cargs, **cparams)
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 376, in connect
return self.dbapi.connect(*cargs, **cparams)
sqlalchemy.exc.DBAPIError: (Error) ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)') None None

我猜最后一行是要查看的:--

sqlalchemy.exc.DBAPIError: (Error) ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified (0) (SQLDriverConnect)') None None

可以从其他客户端连接到数据库,因此凭据等都很好。

我不确定是什么原因造成的 - 谁能帮忙?

提前致谢!

【问题讨论】:

  • 您需要下载并安装实际的Vertica drivers。您必须注册一个帐户。

标签: sqlalchemy vertica


【解决方案1】:

SQLAlchemy 正在使用 unixODBC 连接到 Vertica。你需要install the driversset up a DSN

您应该能够使用这些参数进行连接。这就是我之前的 SQLAlchemy / Vertica 项目中对我有用的方法。此外,如果这不起作用,我会确保它配置正确,并且您可以使用 isql(带有 unixODBC)进行连接。

drivername='vertica+pyodbc',
username='myuser',
password='mypassword',
host='hostname',
database='DBNAME',

您也可以对 DSN 连接执行此操作:

engine = create_engine('vertica+pyodbc://username:password@mydsn')

【讨论】:

  • 谢谢 - 我已经创建了 DSN 并拥有 Vertica 驱动程序。假设它被称为“test”,你如何在“create_engine”调用中引用它?我假设它在那里被引用。
  • 您能分享一下您的 DNS 设置吗?我试图按照链接中的说明进行操作,但没有成功。
  • @Marigold 您收到的错误信息是什么?您可以通过isql 连接吗?
  • Thaanks @woot,我设法将所有这些与来自互联网的教程结合在一起。添加了另一个答案,以防万一有人遇到同样的问题。
【解决方案2】:

这是为 Ubuntu 14.04 设置的,假设您在 /opt/vertica/ 中安装了驱动程序,并使用此 Dockerfile https://hub.docker.com/r/sumitchawla/vertica/ 中的 HP Vertica 并拥有 https://github.com/jamescasbon/vertica-sqlalchemy

/etc/vertica.ini

[Driver]
ErrorMessagesPath = /opt/vertica/lib64/
ODBCInstLib = /usr/lib/x86_64-linux-gnu/libodbcinst.so
DriverManagerEncoding=UTF-16

~/.odbc.ini

[ODBC Data Sources]
vertica = "My Database"

[verticadsn]
Description = My Database
Driver = /opt/vertica/lib64/libverticaodbc.so
Database = docker
Servername = 127.0.0.1
UID = dbadmin
PWD =

如果你做的一切都正确,这个命令应该返回你的 Vertica 版本

engine = create_engine('vertica+pyodbc://dbadmin:@verticadsn')
engine.connect().scalar('select version()')

【讨论】:

  • 我认为在engine = create_engine('vertica+pyodbc://dbadmin:@verticadsn') 中写入dbadmin: 会覆盖.odbc.ini 文件中的UID 和PWD。 engine = create_engine('vertica+pyodbc://@verticadsn') 工作得很好
猜你喜欢
  • 1970-01-01
  • 2015-04-11
  • 2020-04-05
  • 2020-10-27
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多