Форум сайта python.su
Всем привет.
Столкнулся с такой проблемой. Мне надо реализовать отношение многие-ко-многим в рамках одной таблицы. Используется SQLAlchemy. Есть пара таблиц:
users:
id (PK)
name
users_friendship:
parent_id (FK к users.id)
child_id (FK к users.id)
users ссылается сама на себя через таблицу-отношение users_friendship В общем данная схема определяется в коде:
... class User(Base): __tablename__ = 'users' id = Column(Integer(), primary_key=True) name = Column(String(255)) class Friendship(Base): __tablename__ = 'users_friendship' parent_id = Column(Integer(), ForeignKey('users.id'), primary_key=True) child_id = Column(Integer(), ForeignKey('users.id'), primary_key=True) Base.metadata.create_all()
from sqlalchemy.ext.automap import automap_base ... AutoBase = automap_base() AutoBase.prepare(reflect=True) u = AutoBase.classes.users( name='vasya', email='vasya' )
... def name_for_collection_relationship(base, local_cls, referred_cls, constraint): return referred_cls.__name__.lower() + "_collection" # Дефолтная реализация AutoBase.prepare(reflect=True, name_for_collection_relationship=name_for_collection_relationship) ...
Офлайн
Так пойдет?
from sqlalchemy import create_engine from sqlalchemy.ext.automap import automap_base, name_for_collection_relationship engine = create_engine('sqlite:////home/pooh/test.db', echo=True) AutoBase = automap_base() def _name_for_collection_relationship(base, local_cls, referred_cls, constraint): if local_cls.__name__ == 'users': if 'child_id' in constraint.column_keys: return 'child_list' else: return 'parent_list' else: return name_for_collection_relationship(base, local_cls, referred_cls, constraint) AutoBase.prepare(engine, reflect=True, name_for_collection_relationship=_name_for_collection_relationship) u = AutoBase.classes.users( name='vasya', email='vasya' )
Офлайн
PooHБлагодарю. Работает. Примерно так я и предполагал. Только вот не хватило ума на
PooH
… if ‘child_id’ in constraint.column_keys …Мне опыт в копилку. Вам, уважаемый “+” в карму
Офлайн