繁体   English   中英

带有关联类和关系的sqlalchemy noForeignKeys错误

[英]sqlalchemy noForeignKeys error with association class and relationship

我的sqlalchemy关系出现错误。 该关系被建模为关联对象。 编译后,出现以下错误:

 "specify a 'primaryjoin' expression." % self.prop) sqlalchemy.exc.NoForeignKeysError: 

无法确定关系Entries.users_who_have_read_this上的租用/子级表之间的联接条件-没有链接这些表的外键。 确保引用列与ForeignKey或ForeignKeyConstraint关联,或指定“ primaryjoin”表达式。

class UsersReadArticles(alchemyDB.Model):
    '''
    '''
    __tablename__ = 'users_read_articles'
    id = alchemyDB.Column(alchemyDB.Integer, primary_key = True)
    user_id = alchemyDB.Column(alchemyDB.Integer, alchemyDB.ForeignKey('users.id'))
    article_id = alchemyDB.Column(alchemyDB.Integer, alchemyDB.ForeignKey('entries.id'))
    date_read = alchemyDB.Column(alchemyDB.DateTime)

class Entries(alchemyDB.Model):
    __tablename__ = 'entries'

users_who_have_read_this = alchemyDB.relationship('UsersReadArticles',
                                                  foreign_keys = [UsersReadArticles.user_id],
                                                  backref = alchemyDB.backref('users_who_have_read_this', lazy = 'joined'),
                                                  lazy = 'dynamic',
                                                  cascade = 'all, delete-orphan')

class User(UserMixin, alchemyDB.Model):
    __tablename__ = 'users'
    id = alchemyDB.Column(alchemyDB.Integer, primary_key = True)
    user_email = alchemyDB.Column(alchemyDB.String(64), unique = True, index = True)

我在这里做错了什么?

首先,您的问题是SqlAlchemy无法初始化表“ users_read_articles”上的ForeignKey“ entries.id”的目标列,因为表“ entries”没有名为“ id”的列

其次,在映射器users_who_have_read_this中有一个错误:您不需要为表UsersReadArticles上的“ user_id”列定义外键。 在这种情况下,仅在UsersReadArticles上设置一个前导键就足够了。

因此,我建议进行如下更改:

class UsersReadArticles(alchemyDB.Model):
    __tablename__ = 'users_read_articles'
    id = alchemyDB.Column(alchemyDB.Integer, primary_key = True)
    user_id = alchemyDB.Column(alchemyDB.Integer, alchemyDB.ForeignKey('users.id'))
    article_id = alchemyDB.Column(alchemyDB.Integer, alchemyDB.ForeignKey('entries.id'))
    date_read = alchemyDB.Column(alchemyDB.DateTime, default=datetime.datetime.utcnow)
    user = alchemyDB.relationship("User", backref="usersreadarticles") 

class Entries(alchemyDB.Model):
    __tablename__ = 'entries'
    id = alchemyDB.Column(alchemyDB.Integer, primary_key = True)
    title = alchemyDB.Column(alchemyDB.String(255))
    users_who_have_read_this = alchemyDB.relationship('UsersReadArticles',
                                                  backref = alchemyDB.backref('users_who_have_read_this', lazy = 'joined'),
                                                  lazy = 'dynamic',
                                                  cascade = 'all, delete-orphan')

class User(alchemyDB.Model):
    __tablename__ = 'users'
    id = alchemyDB.Column(alchemyDB.Integer, primary_key = True)
    user_email = alchemyDB.Column(alchemyDB.String(64), unique = True, index = True)

测试:

e = Entries()
e.title = 'Article 1'
alchemyDB.session.add(e)

u = User()
u.user_email = 'dedeco@gmail.com'
alchemyDB.session.add(u)
alchemyDB.session.commit()

r = UsersReadArticles()
r.user_id = u.id
r.article_id = e.id
alchemyDB.session.add(r)
alchemyDB.session.commit()

u = User()
u.user_email = 'xpto@gmail.com'
alchemyDB.session.add(u)
alchemyDB.session.commit()

r = UsersReadArticles()
r.user_id = u.id
r.article_id = e.id
alchemyDB.session.add(r)
alchemyDB.session.commit()

结果:

>>> art = alchemyDB.session.query(Entries).all()
>>> for a in art:
...     print a.title, "Who read:"
...     for u in a.users_who_have_read_this:
...         print u.user.user_email
... 
Article 1 Who read:
dedeco@gmail.com
xpto@gmail.com

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM