账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    sqlalchemy创建一对多关系时报错
    • 2019-07-27 00:00
    • 10
    50
    0

    问题描述

    User表中name和phone_number组成联合主键, Express表中将User表中的联合主键设为外键,然后在Express中添加user的relationship,创建表时没有问题,但是插入一个User,
    运行时报错:sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Express.user - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.

    问题出现的环境背景及自己尝试过哪些方法

    查阅了官方文档,自我感觉逻辑和语法都没有问题

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)
    class User(base):

    __tablename__ = 'user'
    # id = Column(Integer)
    name = Column(String(32), primary_key=True, nullable=False)
    phone_number = Column(String(64), primary_key=True, nullable=False)
    # express_id = relationship('Express')
    
    

    class Express(base):

    __tablename__ = 'express'
    id = Column(Integer, primary_key=True, autoincrement=True)
    express_id = Column(String(64), nullable=False)
    user_phone = Column(String(64))
    user_name = Column(String(64))
    ForeignKeyConstraint(('user_name', 'user_phone'), ['user.name', 'user.phone_number'])
    user = relationship('User', backref='user_express')
    
    

    base.metadata.create_all(engine)

    你期待的结果是什么?实际看到的错误信息又是什么?

    错误信息:

    sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Express.user - there are no foreign keys linking these tables.  Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.
    1
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 在SQLAlchemy中,如果创建一对多关系报错,可能是由于以下几个原因:

      1. 你可能尝试连接到一个不存在的表或列。确保你的SQL查询指向的表或列确实存在。

      2. 如果你的模型中包含多个属性,可能需要在创建模型时指定它们。例如,如果你有一个名为order的模型,你可能需要在创建它时提供status属性:

      python class Order(Base): id = Column(Integer, primary_key=True) status = Column(String(100), unique=True)

      1. 如果你的模型中包含SQLAlchemy的字段,可能需要在模型类的初始化方法中使用init_db函数。这个函数可以用来创建数据库连接:

      python class Order(Base): init_db = db.create_engine('sqlite:///orders.db')

      1. 如果你的模型中包含复杂的SQL查询,可能需要使用with statement来执行这些查询。这样可以避免SQL注入攻击:

      python with db.connect() as connection: order = Order(id=1, status='order1') order.save()

      以上都是一些可能的原因和解决方法。如果你还有其他问题,可能需要提供更多的上下文信息。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部