SQL-алхимия и фляжка - PullRequest
       7

SQL-алхимия и фляжка

0 голосов
/ 08 ноября 2018

ОБНОВЛЕНИЕ: благодаря одному из комментариев, которые я получил ближе, я добавил таблицу ассоциации:

association = db.Table('association',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('restaraunt_id', db.Integer, db.ForeignKey('restaraunt.id'), primary_key=True)
)

Это работало довольно хорошо, в оболочке я смог:

u=User(username='bob', email='bob@villa.com')
db.session.add(u)
db.session.commit()
r=Restaraunt(name='Five Guys', costRating=4)
db.session.add(r)
db.session.commit()
rp=RestarauntPreferences(user=u, restaraunt=r, rating=0)
db.session.add(rp)
db.session.commit()

Тогда:

rp.restaraunt.name
['Five Guys']

УДИВИТЕЛЬНЫЙ. НО ... db.session.add (rp) добавляет повторяющиеся записи в таблицу RestarauntPreferences? Что-то с тем, как я объявил об ассоциации? Что-то еще я не получаю об SQLAlchemy и фляге? (И, используя браузер БД для просмотра базы данных sqlite, таблица ассоциаций не содержит никакой информации после того, как я запускаю команды оболочки, не уверен, правильно ли это ... или нет?)

ORIG POST: (модели ниже)

Я пытался создать это маленькое приложение для колб, которое использует SQLAlchemy. Модели, с которыми я пытаюсь работать и с которыми работаю, - это многие ко многим. Они описаны ниже с тем, как я хочу их использовать.

(По сути, пользователь может дать оценку нескольким ресторанам)

#how do I use these??

rprefs=RestarauntPreferences.query.filter_by(user=current_user) 
rprefs.restaraunt.name   #doesn't work, doesn't know what restaraunt is

#models below

class User(UserMixin, db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), index=True, unique=True)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    recipient_idf= db.Column(db.String(256))
    first_name = db.Column(db.String(128))
    last_name = db.Column(db.String(128))
    most_recent_lunch_date = db.Column(db.DateTime)
    lunch_Rating = db.Column(db.Integer)
    phone_number = db.Column(db.String(128))

    def set_password(self, password):
        self.password_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.password_hash, password)

    def __repr__(self):
        return '<User {} {}>'.format(self.username, self.recipient_idf)


class Restaraunt(db.Model):
    __tablename__ = 'restaraunt'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))
    costRating = db.Column(db.Integer)

    def __repr__(self):
        return '<Restaraunt {} {}>'.format(self.name, self.costRating)


class RestarauntPreferences(db.Model):
    __tablename__ = 'restaraunt_preferences'
    id = db.Column(db.Integer, primary_key=True)

    restaraunt_id = db.Column(db.Integer, db.ForeignKey('restaraunt.id'))
    restaraunt = relationship("Restaraunt", foreign_keys=[restaraunt_id])

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    user = relationship("User", foreign_keys=[user_id])

    rating = db.Column(db.Integer)


    def __repr__(self):
        return '<RestarauntPref {} {} {}>'.format(self.restaraunt_id, self.user_id, self.rating)

1 Ответ

0 голосов
/ 08 ноября 2018

Обе, Flask-Sqlalchemy и Sqlalchemy , в документах говорится, что для работы отношения «многие ко многим» необходима таблица ассоциации.Попробуйте создать его, как в примерах, и добавьте его в объявление как secondary параметр.

...