Найти - Пользователи
Полная версия: sqlalchemy models
Начало » Python для новичков » sqlalchemy models
1 2
ilnur
привет. никогда не работал с алхимией. вот теперь пришлось. и чето у меня не заводится

модели

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

объясните пожалуйста, что я делаю не так? я чет запутался

БД мускул. в мускуле таблицы есть.
4kpt_III
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.
ilnur
model2_ids = relationship('Model2')
а что это за свойство будет у модели? я так думал, что если у меня будет экземпляр Model1, то через точку я получал всех его model2

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

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

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

mysql://user:passw@localhost/db_name

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

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

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

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

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

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

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

Почему? Дополнительно устанавливать нельзя?
ilnur
чето все равно до меня доходит, что я делаю не так :)

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

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

P.S. Смотрите внимательно где находится FK.
4kpt_III
А. Блин. Не дочитал. Просто уберите sqlachemy-migrate и все будет нормально. Вы все правильно делали, ссори. Это миграции такие безумные…
4kpt_III
Для миграций используйте alembic. Он от автора алхимии и большую часть задач решает на “ура”. Редактировать миграции почти не приходится.

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

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

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

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

P.S. Ну и для прикручивания алембика нужно добавить 2 строки в его конфиг файл. Ну и установить, естественно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB