Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 28, 2015 16:00:11

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

sqlalchemy models

привет. никогда не работал с алхимией. вот теперь пришлось. и чето у меня не заводится

модели

# 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'))

модели лежат в БД, заливал через миграции sqlalchemy-migrate

# 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()

Вопросы:

1.
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.   

2. ок. сделал явный импорт, и подсунул ему сам класс
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)

Офлайн

#2 Сен. 28, 2015 18:44:42

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

sqlalchemy models

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, не повторяя в каждой таблице.

ilnur
модели лежат в БД, заливал через миграции sqlalchemy-migrate
Alembic.

Офлайн

#3 Сен. 29, 2015 08:44:10

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

sqlalchemy models

model2_ids = relationship('Model2')
а что это за свойство будет у модели? я так думал, что если у меня будет экземпляр Model1, то через точку я получал всех его model2

4kpt_III
Model2 и model2 немного разные вещи, Вы не находите
нахожу, только не понял, это вы к чему?

4kpt_III
Это же не джанга
ага, это и запутывает.

4kpt_III
Почему table?
не понял. вот такой engine у меня работает.

mysql://user:passw@localhost/db_name

проект уже написан и я его дорабатываю/расширяю. ограничен только теми батарейками что уже используется. поэтому sqlalchemy-migrate

Офлайн

#4 Сен. 29, 2015 13:58:19

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

sqlalchemy models

ilnur
а что это за свойство будет у модели? я так думал, что если у меня будет экземпляр Model1, то через точку я получал всех его model2

Свойство не будет определено, потому как не определена сторона FK.

ilnur
нахожу, только не понял, это вы к чему?

При деклоративном стиле регистр имеет значение.

ilnur
не понял. вот такой engine у меня работает.

Причем здесь это. Я имел ввиду, что синтаксис не деклоративный. Таким синтаксисом описывают чаще всего модели при работе с asynchttp. Потому что там нет ОРМа. Хотя можно и деклоративным описать, а потом получить доступ к табличному пространству. Поэтом я и спросил, зачем Вы это делаете. Ну раз проект уже готовый и Вы просто его доделываете, тогда понятно.

ilnur
проект уже написан и я его дорабатываю/расширяю. ограничен только теми батарейками что уже используется. поэтому sqlalchemy-migrate

Почему? Дополнительно устанавливать нельзя?

Офлайн

#5 Сен. 29, 2015 14:18:34

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

sqlalchemy models

чето все равно до меня доходит, что я делаю не так :)

можете показать рабочий пример на мох моделях?

Офлайн

#6 Сен. 29, 2015 14:25:17

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

sqlalchemy models

Сделаю проще

Все типы связей и их описания…

P.S. Смотрите внимательно где находится FK.

Отредактировано 4kpt_III (Сен. 29, 2015 14:26:40)

Офлайн

#7 Сен. 29, 2015 14:30:50

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

sqlalchemy models

А. Блин. Не дочитал. Просто уберите sqlachemy-migrate и все будет нормально. Вы все правильно делали, ссори. Это миграции такие безумные…

Отредактировано 4kpt_III (Сен. 29, 2015 14:34:04)

Офлайн

#8 Сен. 29, 2015 14:39:24

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

sqlalchemy models

Для миграций используйте alembic. Он от автора алхимии и большую часть задач решает на “ура”. Редактировать миграции почти не приходится.

Теперь вопрос. А что, две модели находятся в разных файлах?

Отредактировано 4kpt_III (Сен. 29, 2015 14:39:32)

Офлайн

#9 Сен. 29, 2015 14:44:16

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

sqlalchemy models

4kpt_III
А что, две модели находятся в разных файлах?
да. модели же могут находиться в разных файлах?

а миграции и так вроде бы работают. по крайней мере в БД то все создается.

я работал както с алембиком. но пока тут я её прикрутить не могу

Отредактировано ilnur (Сен. 29, 2015 14:45:32)

Офлайн

#10 Сен. 29, 2015 14:56:01

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

sqlalchemy models

Могут, но в случае связывания одна модель должна знать о другой. Оно и пишет, что не может найти это имя в пространстве имен.

When initializing mapper Mapper|VMInstance|vminstance, expression 'Model2' failed to locate a name ("name 'Model2' is not defined").

P.S. Ну и для прикручивания алембика нужно добавить 2 строки в его конфиг файл. Ну и установить, естественно.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version