2016-09-06 3 views
0

PostgreSQLへのSQLAlchemy接続がUnixソケットまたはIPv4以上であることを確認する方法を教えてください。 IPv6経由でのみ接続します。SQLAlchemyは、UnixソケットまたはIPv4の前にIPv6経由でPostgreSQL接続を試行します

私はcreate_engineを@localhostとして設定しましたが、ホストIPv6ホスト ":: 1"の失敗が最下部にあることに注意してください。私は故意にpg_hba.conf(下記参照)のIPv6信頼を削除してエラーを表示しました。その行のコメントを外すと、IPv6経由で正常に接続され、UnixとIPv4はスキップされます。

# TYPE DATABASE  USER   ADDRESS     METHOD 

# "local" is for Unix domain socket connections only 
local all    all          trust 
# IPv4 local connections: 
host all    all    127.0.0.1/32   trust 
# IPv6 local connections: 
#host all    all    ::1/128     trust 

関連情報/var/lib/pgsql/9.5/data/pg_hba.confから/var/lib/pgsql/9.5/data/postgresql.conf

から

>>> from sqlalchemy import * 
db = create_engine('postgresql://[email protected]:5432/mydb', echo=True) 
>>> metadata = MetaData(db) 
>>> users = Table('users', metadata, 
... Column('user_id', Integer, primary_key=True), 
... Column('name', String(40)), 
... Column('age', Integer), 
... Column('password', String), 
...) 
>>> users.create() 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 1044, in _do_get 
    return self._pool.get(wait, self._timeout) 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/util/queue.py", line 145, in get 
    raise Empty 
sqlalchemy.util.queue.Empty 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/engine/base.py", line 2074, in _wrap_pool_connect 
    return fn() 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 376, in connect 
    return _ConnectionFairy._checkout(self) 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 713, in _checkout 
    fairy = _ConnectionRecord.checkout(pool) 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 480, in checkout 
    rec = pool._do_get() 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 1060, in _do_get 
    self._dec_overflow() 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__ 
    compat.reraise(exc_type, exc_value, exc_tb) 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 186, in reraise 
    raise value 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 1057, in _do_get 
    return self._create_connection() 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 323, in _create_connection 
    return _ConnectionRecord(self) 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 449, in __init__ 
    self.connection = self.__connect() 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/pool.py", line 607, in __connect 
    connection = self.__pool._invoke_creator(self) 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/engine/strategies.py", line 97, in connect 
    return dialect.connect(*cargs, **cparams) 
    File "/usr/local/lib/python3.5/site-packages/sqlalchemy/engine/default.py", line 385, in connect 
    return self.dbapi.connect(*cargs, **cparams) 
    File "/usr/local/lib/python3.5/site-packages/psycopg2/__init__.py", line 164, in connect 
    conn = _connect(dsn, connection_factory=connection_factory, async=async) 
psycopg2.OperationalError: FATAL: no pg_hba.conf entry for host "::1", user "vaderade", database "mydb", SSL off 

関連情報

#------------------------------------------------------------------------------ 
# CONNECTIONS AND AUTHENTICATION 
#------------------------------------------------------------------------------ 

# - Connection Settings - 

listen_addresses = 'localhost'   # what IP address(es) to listen on; 
             # comma-separated list of addresses; 
             # defaults to 'localhost'; use '*' for all 
             # (change requires restart) 
port = 5432        # (change requires restart) 

細目:

  • のRed Hat 7.2
  • のPostgreSQL 9.5.4
  • のPython 3.5.2
  • SQLAlchemyの== 1.0.14
  • psycopg2の== 2.6.2
+2

使用' 127.0.0.1'のデフォルト以外の場所でのUNIXドメインソケットを介して接続します。 – univerio

+0

うわー。ありがとうございました...そのトリックでした。 – vaderade

答えて

0

あなたがlocalhostを使用する場合、それは何であるTCPコネクショントラフを使用します。あなたのシステムでlocalhostとして応答するように設定されています。 Linuxの場合、一般的に/etc/hostsにマップされており、一般的にはIPv4 127.0.0.1または::1(これはおそらくそうです)です。

  • postgresql://[email protected]:5432/mydb

    は、今あなたがローカルで接続する場合は、オプションを持っている(IPv4またはIPv6がシステムに依存している場合)、TCP localhostを経由

  • postgresql://[email protected]:5432/mydbを接続:TCP IPv4のlocalhostの
  • を介して接続します
  • postgresql://[email protected][::1]:5432/mydb:TCPのIPv6経由で接続するには、
  • postgresql://[email protected]:5432/mydbをlocalhostの:それはあなたがトイレです答えです(デフォルトUNIXドメインソケットの位置を介して接続しますのための王)
  • postgresql://[email protected]:5432/mydb?host=/path/to/socket:代わりにlocalhost` `の/path/to/socket
+0

ありがとうございました。一度univerioがそれを言い終えると、localhost部分は意味を成しましたが、これは私が認証することを好む方法です。 – vaderade

関連する問題