2013-08-08 4 views
2

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

Функция Пример:

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 компилятор имеет дело с ним, поскольку unicode имеет функцию замены. Если значение имеет тип Table, чем я предполагаю, в зависимости от кодировки схемы базы данных (которая в моем случае является unicode), таблица через некоторый динамический микс в классе или через какой-то другой механизм/шаблон шаблона 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#metadata-reflection

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

ответ

3

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

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

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

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

File "C:\Anaconda\lib\site-packages\sqlalchemy\dialects\sqlite\base.py", line 779, in get_columns qtable = quote(table_name)