Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 15, 2015 23:15:52

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

sqlalchemy проблема с примесями

bismigalis

Не должно работать

Офлайн

#2 Апрель 15, 2015 23:16:46

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

sqlalchemy проблема с примесями

Ну да. Как я и думал. Этот класс находится вне маппера…

P.S. Самое, что интересное, что ответ на Ваш вопрос я написал уже во четвертом посте Воду в ступе толчем и толчем. Зато себя заняли хоть как-то

Отредактировано 4kpt_III (Апрель 15, 2015 23:19:10)

Офлайн

#3 Апрель 15, 2015 23:17:58

lightarhont
Зарегистрирован: 2014-07-20
Сообщения: 44
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy проблема с примесями

4kpt_III
Я наконец-таки понял, что Вы хотите сделать. Самый простой вариант - использовать фиксированный префикс, как я написал выше. Второй вариант значительно хардкорнее. Теперь я его не рекомендую.

А вот тут подробнее…

У меня вретится в голове лишь установить сюда переменные:
@declared_attr
def users(cls):
return relationship(“Users”, uselist=False, primaryjoin=“Users.id == Blocks.user_id”)

Вместо “Users” и “Blocks” которые получали бы имя класса, но как это сделать я dontknow…

Офлайн

#4 Апрель 15, 2015 23:24:18

lightarhont
Зарегистрирован: 2014-07-20
Сообщения: 44
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy проблема с примесями

4kpt_III
Ну да. Как я и думал. Этот класс находится вне маппера…

P.S. Самое, что интересное, что ответ на Ваш вопрос я написал уже во четвертом посте Воду в ступе толчем и толчем. Зато себя заняли хоть как-то

да читать то умеем:
1. Называть все с одним префиксом и в @declared_attr формировать связь учитывая базовый префикс.

не понятно как это сделать. опыта то у меня с Python чуть более года. До этого только PHP.

Офлайн

#5 Апрель 15, 2015 23:24:40

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

sqlalchemy проблема с примесями

lightarhont

Ну начнем с того, что никаким cls там и не пахло

А по-вопросу:

class OpsUser(SUser, Base):
    
    @declared_attr
    def users(self):
        fixed_prefix = self.__name__[:self.__name__.find("User")]
        return relationship(fixed_prefix + "Permissions")
#
class OpsPermissions(SPermissions, Base):

Идея, думаю, ясна.

Отредактировано 4kpt_III (Апрель 15, 2015 23:25:38)

Офлайн

#6 Апрель 16, 2015 12:41:26

lightarhont
Зарегистрирован: 2014-07-20
Сообщения: 44
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy проблема с примесями

А что если добавить класс в число предков SUsers с новым значением “Users”?

Вот такой:

#CS - construction shemas
class CS:
    __cs__ = {'SUsers': 'User'}

Но делать это не в самом модуле схем, а в модуле моделей RBAC_USERS или COMMENTS_USERS?
Вроде как это можно сделать через метаклассы.

Тогда в схемах остаётся прописать лишь:

class SBlocks(IDB, PKID, CS):
    
    __tablename__ = 'blocks'
    
    @declared_attr
    def user_id(cls):
        return Column(Integer, ForeignKey('users.id'))
    
    @declared_attr
    def permission_id(cls):
        return Column(Integer, ForeignKey('permissions.id'))
    
    @declared_attr
    def fromuser_id(cls):
        return Column(Integer, ForeignKey('users.id'))
    
    datestart = Column(Integer)
    dateend = Column(Integer)
    blockcomment = Column(Unicode(255))
    
    @declared_attr
    def users(cls):
        return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin="Users.id == %s.user_id" % cls.__name__)
    
    @declared_attr
    def permissions(cls):
        return relationship("Permissions", uselist=False)
    
    @declared_attr
    def fusers(cls):
        return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin="Users.id == %s.fromuser_id" % cls.__name__)

А затем уже наследовать class RBAC_USERS(SUsers, Base).

По идее должно работать… Как в Python добавить класс в число предков?
Как то вот так вот может?
http://habrahabr.ru/post/65625/

Офлайн

#7 Апрель 16, 2015 13:09:42

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

sqlalchemy проблема с примесями

Понимаете, что Вы делаете вызов моделей (для получения данных), которые имеют одинаковые названия. В этом проблема. А не в том, как правильно их подключить. Поэтому самым простым решением является сделать модели с разными именами, но с одними ссылками на таблицы БД. То, что Вы написали не только усложняет но еще и заставляет описывать допустимые согласования в каком-то отдельном классе. Путаете следы как профессиональный заяц-рысак.

P.S. Я же уже говорил, что в declared_attr в вашем случае нет cls там self в чистом виде.

P.S.S. Ну и так вообще-то никто не делает. Не для этого миксины нужны.

Офлайн

#8 Апрель 16, 2015 15:24:44

lightarhont
Зарегистрирован: 2014-07-20
Сообщения: 44
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy проблема с примесями

В общем решил так вопрос:

Где Base я ипортирую cs

def cs(cs):
    from testproject.models.shemas import CS
    setattr(CS, "__cs__", cs)

Затем вместе с моделями просто вызываю перед ними:
cs({'SUsers': ‘Users’})

свзяи срабатывают
@declared_attr
    def users(cls):
        return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin="Users.id == %s.user_id" % cls.__name__)

Возмлжная проблема это то что нужно прописывать каждый раз cs({'SUsers': ‘Users’, …})

Возможно лучше использовать метакласс, поскольку он автоматически сможет получать имя функции, но что то мне подсказывает, что тут не всё так просто там…

Отредактировано lightarhont (Апрель 16, 2015 15:25:35)

Офлайн

#9 Апрель 16, 2015 15:31:41

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

sqlalchemy проблема с примесями

Господи. Какой костыль. Импорт внутри функции вообще яд…

lightarhont
Возможно лучше использовать метакласс, поскольку он автоматически сможет получать имя функции, но что то мне подсказывает, что тут не всё так просто там…

Учитывая Ваши модели и то, что Вы творите, то метаклассы пока будут лишними

Офлайн

#10 Апрель 16, 2015 17:59:41

lightarhont
Зарегистрирован: 2014-07-20
Сообщения: 44
Репутация: +  1  -
Профиль   Отправить e-mail  

sqlalchemy проблема с примесями

Честно говоря снова провал вышел.

Я думал ошибка иза того что я не указал переменную дальше:

@declared_attr
    def users(cls):
        primaryjoin = "%s.id == %s.user_id" % (cls.__cs__['SUsers'], cls.__name__)
        return relationship(cls.__cs__['SUsers'], uselist=False, primaryjoin=primaryjoin)

но исправив не к чему не пришёл…
При добавлении новых моделей опять выходи ошибка связей. Что интересно я даже не знаю как помотреть сязь:
primaryjoin = “%s.id == %s.user_id” % (cls.__cs__, cls.__name__)
поскольку в лог ничего не попадает… Ошибка тоже такая-же…

Отредактировано lightarhont (Апрель 16, 2015 18:00:40)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version