sqlalchemy\dialects\mysql\base.py has a unimplemented function

Issue #2292 resolved
Former user created an issue

when I try to run the tutorial with mysql database, I found it failed with the exception:

_mysql_exceptions.ProgrammingError: (1146, "Table 'test.user' doesn't exist")

and I identified the problem is: in the funciton has_table()

1793 except exc.DBAPIError as e: if self._extract_error_code(e.orig) == 1146: return False raise

the _extract_error_code() function is not implemented

Comments (6)

  1. Mike Bayer repo owner

    The error message you're getting means create_all() has not been called. This is in the tutorial in the bottom of the "declare a mapping" section.

    As for the test case, runs fine for me:

    classics-MacBook-Pro:sqlalchemy classic$ python orm.py 
    classics-MacBook-Pro:sqlalchemy classic$
    

    If I turn echo=True:

    classics-MacBook-Pro:sqlalchemy classic$ python orm.py 
    2011-10-06 15:09:06,026 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
    2011-10-06 15:09:06,026 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:09:06,028 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%'
    2011-10-06 15:09:06,028 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:09:06,029 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
    2011-10-06 15:09:06,029 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:09:06,030 INFO sqlalchemy.engine.base.Engine SHOW COLLATION
    2011-10-06 15:09:06,030 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:09:06,032 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
    2011-10-06 15:09:06,032 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:09:06,033 INFO sqlalchemy.engine.base.Engine DESCRIBE `user`
    2011-10-06 15:09:06,033 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:09:06,035 INFO sqlalchemy.engine.base.Engine DESCRIBE `address`
    2011-10-06 15:09:06,035 INFO sqlalchemy.engine.base.Engine ()
    

    the implementation for _extract_error_code() in this scenario is at http://hg.sqlalchemy.org/sqlalchemy/file/879c932018fd22573163c76042761ce98ccaaaa3/lib/sqlalchemy/connectors/mysqldb.py#l111.

  2. Mike Bayer repo owner

    sorry here's that script dropping the tables first so you can see the CREATE statements too:

    classics-MacBook-Pro:sqlalchemy classic$ python orm.py 
    2011-10-06 15:17:51,159 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
    2011-10-06 15:17:51,159 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,163 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'character_set%%'
    2011-10-06 15:17:51,163 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,165 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'lower_case_table_names'
    2011-10-06 15:17:51,165 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,167 INFO sqlalchemy.engine.base.Engine SHOW COLLATION
    2011-10-06 15:17:51,167 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,172 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
    2011-10-06 15:17:51,172 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,175 INFO sqlalchemy.engine.base.Engine DESCRIBE `address`
    2011-10-06 15:17:51,175 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,177 INFO sqlalchemy.engine.base.Engine DESCRIBE `user`
    2011-10-06 15:17:51,177 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,179 INFO sqlalchemy.engine.base.Engine 
    DROP TABLE address
    2011-10-06 15:17:51,180 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,181 INFO sqlalchemy.engine.base.Engine COMMIT
    2011-10-06 15:17:51,181 INFO sqlalchemy.engine.base.Engine 
    DROP TABLE user
    2011-10-06 15:17:51,181 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,182 INFO sqlalchemy.engine.base.Engine COMMIT
    2011-10-06 15:17:51,184 INFO sqlalchemy.engine.base.Engine DESCRIBE `user`
    2011-10-06 15:17:51,184 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,185 INFO sqlalchemy.engine.base.Engine ROLLBACK
    2011-10-06 15:17:51,185 INFO sqlalchemy.engine.base.Engine DESCRIBE `address`
    2011-10-06 15:17:51,185 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,186 INFO sqlalchemy.engine.base.Engine ROLLBACK
    2011-10-06 15:17:51,187 INFO sqlalchemy.engine.base.Engine 
    CREATE TABLE user (
        id INTEGER NOT NULL AUTO_INCREMENT, 
        username VARCHAR(50) NOT NULL, 
        PRIMARY KEY (id)
    )
    
    
    2011-10-06 15:17:51,187 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,188 INFO sqlalchemy.engine.base.Engine COMMIT
    2011-10-06 15:17:51,188 INFO sqlalchemy.engine.base.Engine 
    CREATE TABLE address (
        id INTEGER NOT NULL AUTO_INCREMENT, 
        user_id INTEGER NOT NULL, 
        street VARCHAR(50), 
        city VARCHAR(50), 
        state CHAR(2), 
        zip VARCHAR(15), 
        PRIMARY KEY (id), 
        FOREIGN KEY(user_id) REFERENCES user (id)
    )
    
    
    2011-10-06 15:17:51,188 INFO sqlalchemy.engine.base.Engine ()
    2011-10-06 15:17:51,190 INFO sqlalchemy.engine.base.Engine COMMIT
    
  3. Former user Account Deleted
    • changed status to open
    • removed status

    it's so strange. my platform: win7 python 3.2 sqlalchemy 0.7.2 MySQLdb 1.2.3 mysql 5.1.18

    it still raise the exception. and when I use debug to dive into the http://hg.sqlalchemy.org/sqlalchemy/file/879c932018fd22573163c76042761ce98ccaaaa3/lib/sqlalchemy/connectors/mysqldb.py file's function.

    find that _extract_error_code' s code has a bug on my platform.

    it should be:

    -112 return exception.args0 +112 return exception.errno

    can you identify this problem for me? thanks. and I wonder why the _extract_error_code of base.py does't be called? return exception.errno

  4. Mike Bayer repo owner

    I'm not aware of a MySQLdb implementation for Python 3. Pypi does not list the package as such: http://pypi.python.org/pypi/MySQL-python/1.2.3 There is no SQLAlchemy support for MySQLdb under Python 3.

    Our only somewhat working dialect for MySQL on Python 3 right now is OurSQL.

    MySQLdb exceptions provide the code within .args0 - there is no .errno attribute on their exception. Here's a demonstration:

    ERROR: test.engine.test_reconnect.RecycleTest.test_basic
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/nose/case.py", line 187, in runTest
        self.test(*self.arg)
      File "/Users/classic/dev/sqlalchemy/./test/engine/test_reconnect.py", line 400, in test_basic
        conn = engine.contextual_connect()
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/engine/base.py", line 2334, in contextual_connect
        self.pool.connect(),
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/pool.py", line 210, in connect
        return _ConnectionFairy(self).checkout()
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/pool.py", line 371, in __init__
        rec = self._connection_record = pool._do_get()
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/pool.py", line 697, in _do_get
        con = self._create_connection()
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/pool.py", line 174, in _create_connection
        return _ConnectionRecord(self)
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/pool.py", line 256, in __init__
        self.connection = self.__connect()
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/pool.py", line 316, in __connect
        connection = self.__pool._creator()
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/engine/strategies.py", line 93, in connect
        dialect.is_disconnect(e, None, None)), \
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/dialects/mysql/base.py", line 1778, in is_disconnect
        return self._extract_error_code(e) in \
      File "/Users/classic/dev/sqlalchemy/./lib/sqlalchemy/connectors/mysqldb.py", line 112, in _extract_error_code
        return exception.errno #args[0](0)
    AttributeError: 'OperationalError' object has no attribute 'errno'
    
    ----------------------------------------------------------------------
    

    base.py isn't called as dialects follow a subclassing pattern where unimplemented methods of the base only serve as markers for that which the subclass must implement.

    Please use the mailing list for continued support here as this is not a bug, thanks !

  5. Log in to comment