support for psycopg2 on python 3

Issue #2033 resolved
Mike Bayer repo owner created an issue

Comments (4)

  1. Former user Account Deleted

    Psycopg 2.4 is out, with Python 3 support: http://initd.org/psycopg/articles/2011/02/27/psycopg-24-released/

    Attempting to use it results in a nasty exception, though:

    from sqlalchemy import schema, types
    from sqlalchemy.engine import engine_from_config
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import scoped_session
    from sqlalchemy.orm.session import sessionmaker
    
    Base = declarative_base()
    
    class User(Base):
        __tablename__ = 'users'
    
        id = schema.Column(types.Integer, autoincrement=True, primary_key=True)
    
    engine = engine_from_config({'url': 'postgresql://user:password@host/database'}, '')
    session = scoped_session(sessionmaker())
    session.configure(bind=engine)
    
    session.query(User).all()
    

    Exception in 0.6.6:

    Traceback (most recent call last):
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 710, in do_get
        return self._pool.get(wait, self._timeout)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/queue.py", line 137, in get
        raise Empty
    sqlalchemy.queue.Empty
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/query.py", line 1580, in all
        return list(self)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/query.py", line 1690, in __iter__
        return self._execute_and_instances(context)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/query.py", line 1695, in _execute_and_instances
        mapper=self._mapper_zero_or_none())
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/session.py", line 719, in execute
        return self._connection_for_bind(engine, close_with_result=True).execute(
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/session.py", line 660, in _connection_for_bind
        return self.transaction._connection_for_bind(engine)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/session.py", line 336, in _connection_for_bind
        conn = bind.contextual_connect()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 1831, in contextual_connect
        self.pool.connect(), 
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 182, in connect
        return _ConnectionFairy(self).checkout()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 369, in __init__
        rec = self._connection_record = pool.get()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 213, in get
        return self.do_get()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 732, in do_get
        con = self.create_connection()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 147, in create_connection
        return _ConnectionRecord(self)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 258, in __init__
        l.first_connect(self.connection, self)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/strategies.py", line 152, in first_connect
        dialect.initialize(c)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/dialects/postgresql/base.py", line 767, in initialize
        super(PGDialect, self).initialize(connection)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/default.py", line 151, in initialize
        self._get_server_version_info(connection)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/dialects/postgresql/base.py", line 918, in _get_server_version_info
        v = connection.execute("select version()").scalar()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 1191, in execute
        params)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 1287, in _execute_text
        return self.__execute_context(context)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 1312, in __execute_context
        r = context.get_result_proxy()._autoclose()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py", line 192, in get_result_proxy
        return base.ResultProxy(self)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 2266, in __init__
        self._init_metadata()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 2273, in _init_metadata
        self._metadata = ResultMetaData(self, metadata)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 2123, in __init__
        colname = colname.decode(dialect.description_encoding)
    AttributeError: 'str' object has no attribute 'decode'
    

    The 0.7b2 version also fails, with a slightly different outer exception:

    Traceback (most recent call last):
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 676, in _do_get
        return self._pool.get(wait, self._timeout)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/util/queue.py", line 137, in get
        raise Empty
    sqlalchemy.util.queue.Empty
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/query.py", line 1637, in all
        return list(self)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/query.py", line 1747, in __iter__
        return self._execute_and_instances(context)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/query.py", line 1753, in _execute_and_instances
        close_with_result=True).execute(querycontext.statement, self._params)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/session.py", line 690, in connection
        close_with_result=close_with_result)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/session.py", line 694, in _connection_for_bind
        return self.transaction._connection_for_bind(engine)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/orm/session.py", line 246, in _connection_for_bind
        conn = bind.contextual_connect()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 2062, in contextual_connect
        self.pool.connect(), 
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 210, in connect
        return _ConnectionFairy(self).checkout()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 374, in __init__
        rec = self._connection_record = pool._do_get()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 698, in _do_get
        con = self._create_connection()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 175, in _create_connection
        return _ConnectionRecord(self)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/pool.py", line 259, in __init__
        pool.dispatch.first_connect.exec_once(self.connection, self)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/event.py", line 214, in exec_once
        self(*args, **kw)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/event.py", line 223, in __call__
        fn(*args, **kw)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/strategies.py", line 162, in first_connect
        dialect.initialize(c)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/dialects/postgresql/base.py", line 766, in initialize
        super(PGDialect, self).initialize(connection)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/default.py", line 171, in initialize
        self._get_server_version_info(connection)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/dialects/postgresql/base.py", line 937, in _get_server_version_info
        v = connection.execute("select version()").scalar()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 1259, in execute
        params)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 1436, in _execute_text
        statement, parameters
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 1519, in _execute_context
        result = context.get_result_proxy()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py", line 198, in get_result_proxy
        return base.ResultProxy(self)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 2420, in __init__
        self._init_metadata()
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 2427, in _init_metadata
        self._metadata = ResultMetaData(self, metadata)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/engine/base.py", line 2283, in __init__
        colname = dialect._description_decoder(colname)
      File "/usr/lib64/python3.1/site-packages/sqlalchemy/processors.py", line 69, in process
        return decoder(value, errors)[0](0)
      File "/usr/lib64/python3.1/encodings/utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    TypeError: must be bytes or buffer, not str
    
  2. Log in to comment