Хочется сделать так, что-бы существовала общая некая табличная схема. Которую расширяют классы с функциями, которые и являются в конечном счёте моделями.
Вероятно это выглядит так:
Схемы:
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 не получается - Возникают проблемы со связями между таблицами в схеме данных.
Как тут быть?