簡體   English   中英

查詢 sqlalchemy 模型的外鍵

[英]querying the foreign key of a sqlalchemy model

一段時間以來,我一直試圖弄清楚如何基於 SQLAlchemy 模型的外鍵運行查詢,並且我已經嘗試檢查文檔並在 stackoverflow 上查看這里,但我找不到任何可以解決此問題的內容。擁有。 我有 2 個 SQLAlchemy 模型:用戶和帳戶定義如下:

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

  id = db.Column(db.Integer, primary_key=True)
  fName = db.Column(db.String(255))
  accounts = db.relationship("Account")

class Account(db.Model):
  __tablename__ = 'account'

  id = db.Column(db.Integer, primary_key=True)
  account_number = db.Column(db.Integer, unique=True, nullable=False)
  lName = db.Column(db.String(255), nullable=False)
  client_id = db.Column(db.ForeignKey("user.id"))

我想要做的是查詢 Account 模型中的所有帳戶,對於每個帳戶,如果它在 client_id 外鍵引用的 User 模型列中具有相應的值,則添加 User 模型中的 fName 值最終結果。 所以它看起來像這樣:

{
  "accounts": [
    {
      "fName": "Abbie",
      "id": 1,
      "account_number": 1234,
      "lName": "Mills"
    },
    {
      "fName": "Katrina",
      "id": 2,
      "account_number": 3848,
      "lName": "Crane"
    },
    {
      "fName": "Sheldon",
      "id": 3,
      "account_number": 384,
      "lName": "Cooper"
    },
    {
      "fName": "Chandler",
      "id": 4,
      "account_number": 1288,
      "lName": "Bing"
    },
    {
      "id": 5,
      "account_number": 1283,
      "lName": "Smith"
    },
    {
      "id": 6,
      "account_number": 3847,
      "lName": "Gary"
    },
    {
      "id": 7,
      "account_number": 2038,
      "lName": "Ryan"
    }
  ]
}

我知道這是我想要的查詢:

class AccountList(Resource):
    @account_ns.doc('get account data')
    def get(self):
        query = account_schema.dump(Account.query.all())
        accountDict = {}
        accountDict['accounts'] = []
        for item in query:
            itemDict = {}
            itemDict = item
            linkQuery = user_schema.dump(db.session.query(User.fName).filter(User.id == Account.client_id).first())
            # print(linkQuery)
            itemDict.update(linkQuery)
            accountDict['accounts'].append(itemDict)
        print(accountDict)
     return accountDict, 200

但是每次運行查詢 db.session.query(User.fName).filter(User.id == Account.client_id).first() 時,用戶的 id 似乎沒有增加並且總是打印相同的值每次,即使對於沒有 client_id 的帳戶對象也是如此。 結果是這樣的:

{
  "accounts": [
    {
      "customer_id": 1,
      "id": 1,
      "lName": "Mills",
      "account_number": 1234,
      "fName": "Abbie"
    },
    {
      "customer_id": null,
      "id": 2,
      "lName": "Smith",
      "account_number": 1283,
      "fName": "Abbie"
    },
    {
      "customer_id": null,
      "id": 3,
      "lName": "Gary",
      "account_number": 484,
      "fName": "Abbie"
    },
    {
      "customer_id": 2,
      "id": 4,
      "lName": "Crane",
      "account_number": 3848,
      "fName": "Abbie"
    },
    {
      "customer_id": 3,
      "id": 5,
      "lName": "Cooper",
      "account_number": 384,
      "fName": "Abbie"
    },
    {
      "customer_id": null,
      "id": 6,
      "lName": "Ryan",
      "account_number": 223,
      "fName": "Abbie"
    },
    {
      "customer_id": 1,
      "id": 7,
      "lName": "Mills",
      "account_number": 48494,
      "fName": "Abbie"
    },
    {
      "customer_id": 4,
      "id": 9,
      "lName": "Bing",
      "account_number": 1288,
      "fName": "Abbie"
    }
  ]
}

這不是我想要的。 我在這里做錯了什么,或者我可以調整我的查詢? 我想到的唯一另一種方法是在 Account 中創建另一列,該列與 client_id 具有相同的值,但未設置為外鍵,以便我可以實際引用該列中行的值。

我已經堅持了一段時間,所以任何幫助將不勝感激。 謝謝!

Sqlalchemy 支持模型中的 backref。 在應用關系時,您還可以使用傳遞 backref 參數,它將幫助您直接從帳戶對象訪問用戶對象。

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

  id = db.Column(db.Integer, primary_key=True)
  fName = db.Column(db.String(255))
  accounts = db.relationship("Account", backref="user")

class Account(db.Model):
  __tablename__ = 'account'

  id = db.Column(db.Integer, primary_key=True)
  account_number = db.Column(db.Integer, unique=True, nullable=False)
  lName = db.Column(db.String(255), nullable=False)
  client_id = db.Column(db.ForeignKey("user.id"))

class AccountList(Resource):
    @account_ns.doc('get account data')
    def get(self):
        query = Account.query.all()
        account_list = []
        for item in query:
            account_dict = item.__dict__
            if item.client_id:
                accout_dict["fName"] = item.user.fName
            account_list.append(account_dict)
     return account_list, 200

為什么不在查詢中明確包含您需要的列?

此外,如果您希望 id 自動遞增,則需要在聲明性類中指定。

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

  id = db.Column(db.Integer, primary_key=True, autoincrement=True)
  fName = db.Column(db.String(255))
  accounts = db.relationship("Account")

#select User.fName and every other column in Account
db.session.query(User.fName,Account).\
                 join(Account, Account.client_id == User.id)
                

# without an explicit join statement
qwry  = session.query(User.fName,Account).\
                filter(Account.client_id == User.id)

這些額外的帖子可能會有所幫助。

通過一個查詢連接多個表

使用連接查詢並避免全選

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM