#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 основан на модели сопоставления идентификаторов, невозможно отобразить (или автоматически сопоставить) таблицу, у которой нет первичного ключа. Должен быть указан произвольный первичный ключ.
Комментарии:
1. Отлично ! Основная причина ошибки для автоматической карты не работает