Подключение к базе данных Vertica с помощью SQLAlchemy

Я пытаюсь подключиться к базе данных Vertica с помощью SQLAlchemy.

Я обнаружил и установил диалект Vertica на https://github.com/jamescasbon/vertica-sqlalchemy. Я также установил 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

К базе данных могут быть подключены другие клиенты, поэтому учетные данные и т. Д. В порядке.

Я не уверен, что вызывает это - может ли кто-нибудь помочь?

Заранее спасибо!


person bzo    schedule 23.05.2014    source источник
comment
Вам необходимо загрузить и установить актуальные драйверы Vertica. Вам нужно будет зарегистрировать учетную запись.   -  person Kermit    schedule 23.05.2014


Ответы (2)


SQLAlchemy использует unixODBC для подключения к Vertica. Вам нужно установите драйверы и настроить 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')
person woot    schedule 23.05.2014
comment
Спасибо - я создал DSN и у меня есть драйвер Vertica. Предполагая, что это называется test, как вы относитесь к нему в вызове create_engine? Я предполагаю, что на это есть ссылка. - person bzo; 24.05.2014
comment
Не могли бы вы поделиться своими настройками DNS? Я безуспешно пытался следовать инструкциям по ссылке. - person Marigold; 29.04.2016
comment
@Marigold Какое сообщение об ошибке вы получаете? Удалось ли вам подключиться через isql? - person woot; 29.04.2016
comment
Спасибо @woot, мне удалось собрать все это вместе с обучающими материалами со всего Интернета. Добавлен еще один ответ на случай, если кто-то столкнется с теми же проблемами. - person Marigold; 29.04.2016

Это настроено для Ubuntu 14.04 при условии, что у вас установлен драйвер в /opt/vertica/ и вы используете HP Vertica из этого файла Docker. https://hub.docker.com/r/sumitchawla/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()')
person Marigold    schedule 29.04.2016
comment
Я думаю, что запись dbadmin: в engine = create_engine('vertica+pyodbc://dbadmin:@verticadsn') перезаписывает UID и PWD в файле .odbc.ini. engine = create_engine('vertica+pyodbc://@verticadsn') отлично работает - person marengaz; 05.09.2016