SQLAlchemy - AttributeError: у объекта 'Table' нет атрибута replace

Я пытаюсь извлечь схему из таблицы в одной базе данных и перенести ее в другую базу данных. Ниже приведена часть функции, которая выполняет эту операцию. Это ошибки, когда Table( ... ) называется.

Пример функции:

def transfer_data(self, from_db, to_db, tables, flush_interval=1000, table_data_filters = {}):
    if from_db is to_db or from_db == to_db:
        raise Exception("""Usage: Can't transfer tables to and from the same database!""")

    source, sengine = (from_db.new_session(), from_db.engine()) if isinstance(from_db, SessionManager) else self.__make_session(from_db)
    dest, dengine = (to_db.new_session(), to_db.engine()) if isinstance(to_db, SessionManager) else self.__make_session(to_db)
    meta = MetaData()
    with source.no_autoflush and dest.no_autoflush:
        for table_name in tables:
            print 'Processing', table_name
            print 'Pulling schema from source server'
            # ERROR OCCURS BELOW WITH CALL TO Table
            table = Table(table_name, meta, autoload=True, autoload_with=sengine)
            # etc...
            # etc...

Ошибка вывода:

table = Table(table_name, meta, autoload=True, autoload_with=sengine)
File "C:\Anaconda\lib\site-packages\sqlalchemy\schema.py", line 332, in __new__
table._init(name, metadata, *args, **kw)
File "C:\Anaconda\lib\site-packages\sqlalchemy\schema.py", line 396, in _init
self._autoload(metadata, autoload_with, include_columns)
File "C:\Anaconda\lib\site-packages\sqlalchemy\schema.py", line 413, in _autoload
self, include_columns, exclude_columns
File "C:\Anaconda\lib\site-packages\sqlalchemy\engine\base.py", line 1595, in run_callable
return conn.run_callable(callable_, *args, **kwargs)
File "C:\Anaconda\lib\site-packages\sqlalchemy\engine\base.py", line 1118, in run_callable
return callable_(self, *args, **kwargs)
File "C:\Anaconda\lib\site-packages\sqlalchemy\engine\default.py", line 262, in reflecttable
return insp.reflecttable(table, include_columns, exclude_columns)
File "C:\Anaconda\lib\site-packages\sqlalchemy\engine\reflection.py", line 397, in reflecttable
for col_d in self.get_columns(table_name, schema, **tblkw):
File "C:\Anaconda\lib\site-packages\sqlalchemy\engine\reflection.py", line 254, in get_columns
**kw)
File "<string>", line 1, in <lambda>
File "C:\Anaconda\lib\site-packages\sqlalchemy\engine\reflection.py", line 49, in cache
ret = fn(self, con, *args, **kw)
File "C:\Anaconda\lib\site-packages\sqlalchemy\dialects\sqlite\base.py", line 779, in get_columns
qtable = quote(table_name)
File "C:\Anaconda\lib\site-packages\sqlalchemy\sql\compiler.py", line 2350, in quote_identifier
self._escape_identifier(value) + \
File "C:\Anaconda\lib\site-packages\sqlalchemy\sql\compiler.py", line 2331, in _escape_identifier
return value.replace(self.escape_quote, self.escape_to_quote)
AttributeError: 'Table' object has no attribute 'replace'

Наблюдение:

Я думаю, что это связано с юникодом (то есть. Basestring) и как с этим справляется компилятор sql, так как юникод имеет функцию замены. Если значение имеет тип Table, чем я представляю, в зависимости от кодировки схемы базы данных (которая в моем случае является Unicode), Table с помощью некоторого динамического микширования в классе или с помощью какого-либо другого механизма oop / шаблона проектирования становится типом Unicode, где replace это унаследованный атрибут / операция, которая вызывается неявно или переопределена где-то.

Ссылка на исходный код: https://bitbucket.org/shaung/sqlalchemy/src/b0a77b7e42f1/lib/sqlalchemy/sql/compiler.py

Документация: http://docs.sqlalchemy.org/en/rel_0_8/core/schema.html

Любая помощь будет принята с благодарностью. - Я использую Anaconda 1.6.2 для своей среды разработки - я использовал postgres для базы данных, но переключился на sqlite, так как база данных была очень маленькой. - В моделях SQL Alchemy используется декларативный синтаксис, поэтому в алхимии используется отражение - Windows 7, 64-битная версия (была в Ubuntu)

1 ответ

Решение

Эта ошибка возникает, когда Table() ожидает имя таблицы типа строка (следовательно, доступ к функции замены), и вместо этого, как указывает ошибка, был Table объект не следует путать с фактическим Table() конструктор, который ошибочно поставил диагноз.

Урок по правильному именованию переменных или знанию того, что передается извне, перед тем как вручить, и, соответственно, кодированию.

Также для тех, кто заинтересован, вы также можете использовать: meta.reflect(bind=sengine) а потом в дальнейшем использовать... table = meta.tables[ name_of_your_table ]

Трассировка стека, которая указала на проблему, была следующей:

Файл "C:\Anaconda\lib\site-packages\sqlalchemy\dialects\sqlite\base.py", строка 779, в get_columns qtable = quote(table_name)

Другие вопросы по тегам