簡體   English   中英

Python SQLAlchemy 查詢不同的返回列表而不是 dict

[英]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_countryinternal_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"), ...]

這里, countryinternal是列名。 您還可以在執行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"作為標識符來表明internalexternal都是可能的:

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.

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