【问题标题】:SQLAlchemy migrating MySQL followers system to PostgreSQL issueSQLAlchemy 将 MySQL 追随者系统迁移到 PostgreSQL 问题
【发布时间】:2015-08-19 20:15:39
【问题描述】:

今天我决定将我相当新的项目转移到 PostgreSQL,但我遇到了一些问题,其中之一是:

下面是一个完全正常的、功能齐全的 MySQL 模型,适用于追随者/被追随系统,但由于某种原因,我不断收到 SQLAlchemy 错误:

sqlalchemy.exc.ArgumentError: 关系 User.followed 无法确定任何 基于连接条件和 remote_side a 的明确本地/远程列对 论据。考虑使用 remote() 注释来准确标记那些元素 关系远程端的连接条件的 nts。

followers = db.Table(
    'followers',
    db.Column('follower_id', db.Integer(), db.ForeignKey('users.id'), primary_key=True),
    db.Column('followed_id', db.Integer(), db.ForeignKey('users.id'), primary_key=True)
)

class Base(db.Model):
    __abstract__ = True

    id = db.Column(db.Integer, primary_key=True)

    created_at = db.Column(db.DateTime, 
                           default=datetime.datetime.utcnow)

    updated_at = db.Column(db.DateTime, 
                           default=datetime.datetime.utcnow,
                           onupdate=datetime.datetime.utcnow)

class User(Base, UserJsonSerializer, UserMixin):
    __tablename__ = 'users'

    email = db.Column(db.String(255), unique=True,)
    followed = db.relationship(
        'User',
        secondary=followers,
        primaryjoin=(followers.c.follower_id == id),
        secondaryjoin=(followers.c.followed_id == id),
        backref=db.backref('followers', lazy='dynamic'),
        lazy='dynamic'
    )

我对 PostgreSQL 很陌生,所以我对这里的问题很迷茫,而且由于这是一个相当复杂的关系,我更不知道该怎么办。

【问题讨论】:

  • 在格式化代码时,我发现updated_at = db.Column(db.DateTime, default=datetime.datetime.utcnow, 行有一个悬空大括号。你能修好那条线吗?谢谢。
  • 是的,我的错,从我的源文件复制时我漏掉了一行,现在已修复。 :)
  • 您得到的错误不是来自 postgresql,如果您唯一要做的就是更改数据库后端,这似乎很奇怪。您使用的是什么版本的 sqlalchemy?两种情况都一样吗?我注意到在以后的版本中似乎不需要使用 primaryjoin/secondaryjoin
  • SqlAlchemy 2.0 on Python 3.5.0b4,上面的代码在 MariaDB 10.0 上运行良好,但在 PostgreSQL 中中断。我用于 SQLA 的 MySQL 方言是 PyMySQL,而 PostgreSQL 方言是 py-postgresql
  • 显然我搞砸了,我提到了 SqlAlchemy 1.0.8 和 Flask-SqlAlchemy 2.0,而不是 SqlAlchemy 2.0...

标签: postgresql sqlalchemy database-schema flask-sqlalchemy


【解决方案1】:

所以我自己找到了一个解决方案,不确定它是否会起作用,但到目前为止,错误似乎已经消失。 干杯。

    followed = db.relationship('User',
                               secondary=followers,
                               foreign_keys=[followers.c.follower_id])

    followers = db.relationship('User',
                                secondary=followers,
                                foreign_keys=[followers.c.followed_id])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2017-12-08
    • 1970-01-01
    • 2021-02-18
    • 2021-10-09
    相关资源
    最近更新 更多