[英]Python SQLAlchemy query distinct returns list of lists instead of dict
我正在使用 SQLAlchemy 來設置一些數據模型並對其進行查詢。 我有以下表格類
class Transactions(Base):
__tablename__ = 'simulation_data'
sender_account = db.Column('sender_account', db.BigInteger)
recipient_account = db.Column('recipient_account', db.String)
sender_name = db.Column('sender_name', db.String)
recipient_name = db.Column('recipient_name', db.String)
date = db.Column('date', db.DateTime)
text = db.Column('text', db.String)
amount = db.Column('amount', db.Float)
currency = db.Column('currency', db.String)
transaction_type = db.Column('transaction_type', db.String)
fraud = db.Column('fraud', db.BigInteger)
swift_bic = db.Column('swift_bic', db.String)
recipient_country = db.Column('recipient_country', db.String)
internal_external = db.Column('internal_external', db.String)
ID = Column('ID', db.BigInteger, primary_key=True)
我正在嘗試使用以下腳本獲取列recipient_country
和internal_external
不同行值
data = db.query(
Transactions.recipient_country,
Transactions.internal_external).distinct()
但是,這不會檢索這兩列的所有不同組合(在這種情況下,它會忽略Transactions.internal_external
值)。 例子:
{
"China": "External",
"Croatia": "External",
"Denmark": "Internal",
"England": "External",
"Germany": "External",
"Norway": "External",
"Portugal": "External",
"Sweden": "External",
"Turkey": "External"
}
當我嘗試
data = db.query(
Transactions.recipient_country,
Transactions.internal_external).distinct().all()
返回正確的輸出,但是它以列表的形式出現,而不是字典。 例子:
[["China","External"],["Croatia","External"],["Denmark","External"],["Denmark","Internal"],["England","External"],["Germany","External"],["Norway","External"],["Portugal","External"],["Sweden","External"],["Turkey","External"]]
我正在嘗試重現以下 SQL 查詢:
SELECT DISTINCT
[recipient_country],
[internal_external]
FROM [somedb].[dbo].[simulation_data];
我希望它將數據作為 dict 返回。 我究竟做錯了什么?
字典中的key
始終是唯一的,因此如果國家(中國)多次出現 - 一次用於外部,一次用於外部 - 然后第二次設置值將覆蓋第一個值:
result = {}
result['China'] = 'internal'
result['China'] = 'external'
print(result) # { 'China': 'external' }
您應該如何將您的查詢可視化為一個對象(或字典)列表,每個對象代表一行。 然后你可以有類似的東西
[dict(country="China", internal="internal"), dict(country="China", internal="external"), ...]
這里, country
和internal
是列名。 您還可以在執行query.column_descriptions
.all()
之前使用query.column_descriptions
從 Query 對象中獲取這些信息。
編輯:您還可以將值存儲在數組中:
query = db.query(
Transactions.recipient_country,
func.array_agg(Transactions.internal_external.distinct())
).group_by(Transactions.recipient_country)
data = {country: options for country, options in query}
print(data) # { 'China': ['internal', 'external'] }
或者您可以使用"both"
作為標識符來表明internal
和external
都是可能的:
query = db.query(
Transactions.recipient_country,
Transactions.internal_external
).distinct()
data = {}
for country, option in query:
if country in data:
option = 'both'
data[country] = option
print(data) # { 'China': 'both' }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.