SQLAlchemy Automap не создает класс для таблиц без первичного ключа

#reflection #sqlalchemy #google-bigquery

#python #sqlalchemy

Вопрос:

Я использую SQL Alchemy v (0.9.1), который имеет функциональность automap. Это позволяет мне автоматически создавать классы и отношения. http://docs.sqlalchemy.org/en/rel_0_9/orm/extensions/automap.html

Проблема, с которой я сталкиваюсь, заключается в том, что при использовании automap_base я вижу, что сопоставлены не все таблицы, доступные в списке metadata.tables.

При подготовке ошибок нет, за исключением того, что я не могу получить доступ к классу (например, Base.classes.Example_Table) из базы после вызова automap_base()

 from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import create_session

from sqlalchemy.ext.automap import automap_base

engine = create_engine("mysql mysqldb://")

Base = automap_base()
Base.prepare(engine, reflect = True)

session = create_session(bind = engine)
 

Затем я бегу, чтобы обнаружить, что классы не существуют для всех таблиц в метаданных (я не использовал только аргумент = [] в метаданных)

 for mappedclass in Base.classes:
    print mappedclass

for mdtable in metadata.tables:
    print mdtable
 

Только для того, чтобы обнаружить, что Example_Table (со следующим синтаксисом create) не имеет класса

     CREATE TABLE `Example_Table` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `attributeType` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3290719 DEFAULT CHARSET=latin1
 

т.е. Base.class.Example_Table возвращает следующую ошибку

     ---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-15-94492ae1b8ba> in <module>()
      7 type(metadata.tables)
      8 
----> 9 Base.classes.Example_Table

/usr/local/lib/python2.7/site-packages/sqlalchemy/util/_collections.pyc in __getattr__(self, key)
    172             return self._data[key]
    173         except KeyError:
--> 174             raise AttributeError(key)
    175 
    176     def __contains__(self, key):

AttributeError: Example_Table
 

Я не думаю, что эта проблема возникает из-за того, что в моем имени Example_Table есть подчеркивание.

Я думаю, что проблема связана с тем фактом, что у моей Example_Table нет первичного ключа. Example_Table предназначен только для связи двух других таблиц.

Ответ №1:

Понял это, просмотрев ссылку / переформулировав проблему.

На случай, если это поможет кому-то другому —

Поскольку SQLAlchemy ORM основан на модели сопоставления идентификаторов, невозможно отобразить (или автоматически сопоставить) таблицу, у которой нет первичного ключа. Должен быть указан произвольный первичный ключ.

http://docs.sqlalchemy.org/en/latest/faq/ormconfiguration.html#how-do-i-map-a-table-that-has-no-primary-key

Комментарии:

1. Отлично ! Основная причина ошибки для автоматической карты не работает