使用SQLAlchemy连接到Vertica数据库

时间:2014-05-23 14:59:07

标签: sqlalchemy vertica

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

我遇到并在https://github.com/jamescasbon/vertica-sqlalchemy安装了Vertica方言。我也安装了pyodbc。

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

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

可以从其他客户端与数据库建立连接,因此凭据等都可以。

我不确定是什么导致这种情况 - 任何人都可以帮忙吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

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')

答案 1 :(得分:0)

这是为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()')