Создание представлений sqlite с использованием простой таблицы отношений «многие ко многим»

#sqlite

#sqlite

Вопрос:

У меня есть база данных pen. Каждое перо (pid) связано с одним брендом (bid) и несколькими тегами (tid). У пера может быть много тегов, а тег может быть связан со многими ручками. У меня есть две таблицы, называемые Pen и Tag. bid — это внешний ключ, хранящийся в таблице Pen. простая таблица отношений «многие ко многим», называемая PenTag. tid и pid — это внешние ключи, хранящиеся в таблице PenTag. Я пытаюсь создать некоторые представления, которые требуют использования таблицы PenTag.

Первый — отфильтровать все ручки и получить те, которые имеют определенный тег (например, получить все ручки, где tid = 3), и отобразить их в виде списка ручек.

Второе представление представляет собой расширенную версию первого, где мне нужно получить список всех ручек с определенным тегом и определенной маркой (например, получить все ручки, где tid = 3 и bid = 2).

Вот изображение моего плана базы данных для пояснения. 1

Я добился второго представления в python, используя sqlalchemy, если это поможет. Прокрутите код вниз, чтобы увидеть мои маршруты.py также.

models.py:

 

# pen tag joining table
PenTag = db.Table('PenTag', db.Model.metadata,
db.Column('pid', db.Integer, db.ForeignKey('Pen.id')),
db.Column('tid', db.Integer, db.ForeignKey('Tag.id'))
)


# brands
class Brand(db.Model):
    __tablename__ = 'Brand'

    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String, nullable = False)
    desc = db.Column(db.Text)
    photo = db.Column(db.Text)
    deletable = db.Column(db.Boolean)
    pens = db.relationship('Pen', backref='brand')

    def __str__(self):
        return self.name


# pens
class Pen(db.Model):
    __tablename__ = "Pen"

    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String, nullable = False)
    desc = db.Column(db.Text)
    photo = db.Column(db.Text)
    bid = db.Column(db.Integer,db.ForeignKey('Brand.id'), nullable = False)
    tags = db.relationship('Tag', secondary=PenTag, back_populates='pens')


    def __str__(self):
        return self.name


# tags
class Tag(db.Model):
    __tablename__ = "Tag"

    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String, nullable = False)
    desc = db.Column(db.Text)
    photo = db.Column(db.Text)
    pens = db.relationship('Pen', secondary=PenTag, back_populates='tags')

    def __str__(self):
        return self.name```

and in my routes.py, I did the following:

~~~brand = models.Brand.query.filter_by(id = selected_brand).first()
   tag = models.Tag.query.filter_by(id = selected_tag).first()
   # Get a list of the pens common between the brand and the tag chosen.
   results = list(set(brand.pens).intersection(tag.pens))~~~
  

Ответ №1:

Я нашел ответ с помощью друга.

Решение заключается в использовании внутреннего соединения. Первое представление:

SELECT * FROM PenTag INNER JOIN Pen ON PenTag.pid = Pen.id WHERE PenTag.tid = 3

И второму представлению просто нужно добавить » И Pen.bid = 2″ в самом конце.