Форум сайта python.su
привет. никогда не работал с алхимией. вот теперь пришлось. и чето у меня не заводится
модели
# model1.py # coding: utf-8 from sqlalchemy import Column, INTEGER, String, DATETIME, FLOAT, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship BASE = declarative_base() class Model1(BASE): __tablename__ = 'model1' id = Column(INTEGER, primary_key=True, nullable=False) model2_ids = relationship('Model2')
# model2.py # coding: utf-8 from sqlalchemy import Column, INTEGER, String, DATETIME from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship BASE = declarative_base() class Model2(BASE): __tablename__ = 'model2' id = Column(INTEGER, primary_key=True, nullable=False) model1_id = Column(INTEGER, ForeignKey('model1.id'))
# coding: utf-8 from sqlalchemy import MetaData, String, Table, Column, INTEGER, FLOAT, DATETIME from migrate.changeset.constraint import ForeignKeyConstraint meta = MetaData() table1 = Table( 'model1', meta, Column('id', INTEGER, primary_key=True, nullable=False), mysql_charset='utf8' ) table2 = Table( 'model2', meta, Column('id', INTEGER, primary_key=True, nullable=False), Column('model1_id', INTEGER), mysql_charset='utf8' ) fkey = ForeignKeyConstraint( columns=[table2.c.model1_ids], refcolumns=[table1.c.id] ) def upgrade(migrate_engine): meta.bind = migrate_engine table1.create() table2.create() fkey.create() def downgrade(migrate_engine): meta.bind = migrate_engine table1.drop() table1.drop() fkey.drop()
model2_ids = relationship('Model2')
sqlalchemy.exc.InvalidRequestError: When initializing mapper Mapper|VMInstance|vminstance, expression 'Model2' failed to locate a name ("name 'Model2' is not defined"). If this is a class name, consider adding this relationship() to the <class '...'> class after both dependent classes have been defined.
model2_ids = relationship(Model2)
sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'model2.model1_ids' could not find table 'model1' with which to generate a foreign key to target column 'id'
Отредактировано ilnur (Сен. 28, 2015 16:00:53)
Офлайн
1. Model2 и model2 немного разные вещи, Вы не находите Когда создается связь, то указывается FK и relationsip. Это же не джанга В table синтаксисе я уже не помню как. В Declarative указывается класс связи в relationship, а в FK указывается “table_name.key” (“model2.id”). В зависимости от стороны ключа FK относительно relationsip формируется тип связи…
2. Почему table? asyncio? Для mysql уже есть драйвер?
3. mysql_charset='utf8'. Можно указать в engine, не повторяя в каждой таблице.
ilnurAlembic.
модели лежат в БД, заливал через миграции sqlalchemy-migrate
Офлайн
model2_ids = relationship('Model2')
4kpt_IIIнахожу, только не понял, это вы к чему?
Model2 и model2 немного разные вещи, Вы не находите
4kpt_IIIага, это и запутывает.
Это же не джанга
4kpt_IIIне понял. вот такой engine у меня работает.
Почему table?
mysql://user:passw@localhost/db_name
Офлайн
ilnur
а что это за свойство будет у модели? я так думал, что если у меня будет экземпляр Model1, то через точку я получал всех его model2
ilnur
нахожу, только не понял, это вы к чему?
ilnur
не понял. вот такой engine у меня работает.
ilnur
проект уже написан и я его дорабатываю/расширяю. ограничен только теми батарейками что уже используется. поэтому sqlalchemy-migrate
Офлайн
чето все равно до меня доходит, что я делаю не так :)
можете показать рабочий пример на мох моделях?
Офлайн
Сделаю проще
Все типы связей и их описания…
P.S. Смотрите внимательно где находится FK.
Отредактировано 4kpt_III (Сен. 29, 2015 14:26:40)
Офлайн
А. Блин. Не дочитал. Просто уберите sqlachemy-migrate и все будет нормально. Вы все правильно делали, ссори. Это миграции такие безумные…
Отредактировано 4kpt_III (Сен. 29, 2015 14:34:04)
Офлайн
Для миграций используйте alembic. Он от автора алхимии и большую часть задач решает на “ура”. Редактировать миграции почти не приходится.
Теперь вопрос. А что, две модели находятся в разных файлах?
Отредактировано 4kpt_III (Сен. 29, 2015 14:39:32)
Офлайн
4kpt_IIIда. модели же могут находиться в разных файлах?
А что, две модели находятся в разных файлах?
Отредактировано ilnur (Сен. 29, 2015 14:45:32)
Офлайн
Могут, но в случае связывания одна модель должна знать о другой. Оно и пишет, что не может найти это имя в пространстве имен.
When initializing mapper Mapper|VMInstance|vminstance, expression 'Model2' failed to locate a name ("name 'Model2' is not defined").
Офлайн