[英]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.