lightarhont
@lightarhont
python/php developer

SQLAlchemy проблема с примесями?

Помогите ибо не нагуглить…

Хочется сделать так, что-бы существовала общая некая табличная схема. Которую расширяют классы с функциями, которые и являются в конечном счёте моделями.

Вероятно это выглядит так:

Схемы:
from sqlalchemy import (Column, Integer, Unicode, Text, ForeignKey)
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import (relationship, backref)
class IDB:
    __table_args__ = {'mysql_engine':'InnoDB', 'mysql_collate': 'utf8_general_ci', 'extend_existing': True}
class PKID:
    id = Column(Integer, primary_key=True)
class SUsers(IDB, PKID):
    
    __tablename__ = 'users'
    
    username = Column(Unicode(32), unique=True)
    email    = Column(Unicode(32), unique=True)
    password = Column(Unicode(64))
    created = Column(Integer)
    activity = Column(Integer)
    
    @declared_attr
    def roles(cls):
        return association_proxy('roles_users', 'roles')
    
    @declared_attr
    def profiles(cls):
        return relationship("Profiles", uselist=False)
class SProfiles(IDB, PKID):
    
    __tablename__ = 'profiles'
    
    @declared_attr
    def userid(cls):
        return Column(Integer, ForeignKey('users.id'))
    
    fullname  = Column(Unicode(64))
    avatar1   = Column(Unicode(32))
    avatar2   = Column(Unicode(32))
    avatar3   = Column(Unicode(32))
class SRoles(IDB, PKID):
    
    __tablename__ = 'roles'
    
    name        = Column(Unicode(16))
    rolesgroup  = Column(Unicode(16))
    description = Column(Unicode(255))
    ordering    = Column(Integer)
    
    @declared_attr
    def permissions(cls):
        return association_proxy('perms_roles', 'permissions')
    
    @declared_attr
    def users(cls):
        return association_proxy('roles_users', 'users')


import time
import datetime
from testproject.models import Base
from testproject.models.shemas import (SUsers, SProfiles, SRoles, SPermissions, SBlocks, SRolesUsers, SPermissionsRoles)
class Users(SUsers, Base):
    
    def __init__(self, username, email, password, created, activity=None, profiles=None, roles=None):
        self.username = username
        self.email    = email
        self.password = password
        self.created = created
        if activity:
            self.activity = activity
        if profiles:
            self.profiles = profiles
        if roles:
            self.roles  = roles
        
    def check_password(self, passwd):
        return self.password == passwd
    
    def datefromtimestamp(self, dateformat='%Y-%m-%d %H:%M:%S'):
        return str(datetime.datetime.fromtimestamp(self.created).strftime(dateformat))
    
    def activityparams(self, activitytime=300, classactiv='useract', classnoactiv='usernoact', dateformat='%Y-%m-%d %H:%M:%S'):
        if (int(time.time()) - self.activity) <= activitytime:
            p1 = classactiv
        else:
            p1 = classnoactiv
        p2 = str(datetime.datetime.fromtimestamp(self.activity).strftime(dateformat))
        return (p1, p2)
class Profiles(SProfiles, Base):
    
    def __init__(self, fullname, register=None, lastlogin=None, expired=None, avatar1=None, avatar2=None, avatar3=None):
        self.fullname  = fullname
        if avatar1:
            self.avatar1   = avatar1
        if avatar2:
            self.avatar2   = avatar2
        if avatar3:
            self.avatar3   = avatar3
class Roles(SRoles, Base):
    
    def __init__(self, name, rolesgroup, description=None, ordering=None):
        self.name = name
        self.rolesgroup = rolesgroup
        if description:
            self.description = description
        if ordering:
            self.ordering = ordering
    
    def shortdesc(self, getsize=68):
        if len(self.description) >= getsize:
            return self.description[:getsize] + '...'
        else:
            return self.description
class Permissions(SPermissions, Base):
    
    def __init__(self, permname, description=None, ordering=None):
        self.permname = permname
        if description:
            self.description = description
        if ordering:
            self.ordering = ordering
    
    def shortdesc(self, getsize=68):
        if len(self.description) >= getsize:
            return self.description[:getsize] + '...'
        else:
            return self.description


Предполагается, что для группу таких моделей хранить в каком то пакете. Например у меня это в пакете rbac. Внутри ещё несколько модулей, для функций:

from sqlalchemy import (desc, asc)
from testproject.models import DBSession
from . import Users, Roles 
def get_user2(itemid):
    return DBSession.query(Users).filter(Users.id == itemid).one()
def get_user(username):
    user = DBSession.query(Users).filter(Users.username == username).all()
    if user:
        return user[0]
    else:
        return None
def add_user():
    pass
#Удалить пользователей по списку
def delete_users(delitems):
    try:
        for e in delitems:
            DBSession.query(Users).filter(Users.id == e).delete()
        transaction.commit()
        result = 1
    except:
        transaction.rollback()
        result = 0
    return result
def get_users(offset=None, limit=None):
    if offset==None or limit==None:
        return DBSession.query(Users).all()
    else:
        return (DBSession.query(Users).all())[offset:limit]


Всё бы хорошо, но мне нужно делать такую схему в каждом __init__.py Где я хочу писать свои функции для моделей.
Тогда возникает проблема, что называть их Users, Roles, Profiles уже не получается - Возникает ошибка.
В то время как и изменять имена классов например: Public_Comments_Users не получается - Возникают проблемы со связями между таблицами в схеме данных.

Как тут быть?
  • Вопрос задан
  • 593 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы