ForeignKey всегда выключен и не работает между таблицами в SQLalchemy во Flask - PullRequest
0 голосов
/ 06 мая 2018

мой код для db во Flask и SQLalchemy работает, но когда я делаю комментарий в посте, ForeignKey не связывает комментарий с этим постом, и при создании комментария в таблице "comment" нет значения post_id.

Знаете ли вы, что может быть не так? Ниже приведены два способа, которыми я пытался создать БД, но ни один из них не установил связи с ForeingKey.

Попытался использовать Pragma для принудительного вызова Foreignkey, но это не помогло. Попытался принудительно установить ForeignKey с помощью sqlite> PRAGMA foreign_keys = ON; но оно не сохраняется.

Вот мой код:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///userdata.db'
db = SQLAlchemy(app)

engine = create_engine('sqlite:///userdata.db')

def _fk_pragma_on_connect(dbapi_con, con_record):
    dbapi_con.execute('pragma foreign_keys=ON')

from sqlalchemy import event
event.listen(engine, 'connect', _fk_pragma_on_connect)

class Post(db.Model):

    __tablename__ = 'post'

    id = db.Column(Integer, primary_key=True)
    title = db.Column(String(50))
    subtitle = db.Column(String(50))
    author = db.Column(String(20))
    date_posted = db.Column(DateTime)
    content = db.Column(Text)
    post_rel = relationship('Comment', 
                            back_populates='comment_rel', 
                            foreign_keys='[Comment.post_id]')

    def get_comments(self):
        return     Comments.query.filter_by(
            post_id=post.id).order_by(Comments.timestamp.desc())

    def __repr__(self):
        return '<Post %r>' % (self.body)

class Comment(db.Model):

    __tablename__ = 'comment'

    id = db.Column(db.Integer, primary_key=True)
    text = db.Column(db.String(140))
    author = db.Column(db.String(32))
    timestamp = db.Column(db.DateTime(), default=datetime.utcnow, index=True)
    post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)
    comment_rel = relationship('Post', uselist=False, back_populates='post_rel')

    def __init__(self, text, author, timestamp):
     """"""
     self.text = text
     self.author = author
     self.timestamp = timestamp

    def __repr__(self):
        return '<Post %r>' % (self.body)

    def show(self):
        return self.author + '\n' + self.text

@app.route('/addcomment', methods=['POST'])
def addcomment():
    commentar = request.form['commentar']
    comment_done = Comment(text=commentar, author=current_user.username,
    timestamp=datetime.now())
    db.session.add(comment_done, 'PRAGMA foreign_keys=on')
    db.session.commit()

    return render_template('post.html', post=post)
...