簡體   English   中英

使用 SQLAlchemy 查詢 SQL 服務器 JSON 列

[英]Query SQL Server JSON columns using SQLAlchemy

我正在尋找一種方法來使用 SQLAlchemy 查詢復制 SQL 服務器的 JSON_VALUE function 的功能。 我正在使用 metadata.reflect 在 SQLAlchemy 中定義我現有的數據庫表。

SQL:

SELECT Id,
JSON_VALUE(BankDataJSON,'$.AccountName')
FROM BankData

SQLAlchemy Model:

db = SQLAlchemy()
db.Model.metadata.reflect(db.engine)

class BankData(db.Model):
    __table__ = db.Model.metadata.tables['BankData'] 

端點/查詢:

@cust_accts_bp.route('/api/CustomerAccts')
def get_cust_accts():
    custId = request.args.get('custId')

    db = SQLAlchemy(app)
    BankData = models.bank_data.BankData
    BankAccounts = models.bank_accounts.BankAccounts

    qry = db.session.query(BankAccounts.Id, BankAccounts.AccountNumber, BankAccounts.BankName,
                           BankData.AppId, BankData.CustomerId, BankAccounts.Filename, BankData.BankDataJSON) \
                           .filter(
                               and_(BankData.Id == BankAccounts.BankDataId, BankData.CustomerId == custId)
                            )

    engine = app.config['SQLALCHEMY_DATABASE_URI']
    df = pd.read_sql(qry.statement, engine)

    df['BankDataJSON'] = df['BankDataJSON'].apply(json.loads) # convert string representation of JSON
    df['BankDataJSON'] = df['BankDataJSON'].map(lambda x:[x[i] for i in x if i=='AccountName'][0])
    df = df.rename(columns={'BankDataJSON':'BusinessName'})

    response = json.loads(df.to_json(orient="records"))

    return(json.dumps(response))

使用這種方法,我必須手動將 JSON object (BankDataJSON) 序列化為 Python 字典,並解析它以獲得我想要的值('AccountName')。 如果我使用 SQL 服務器的 JSON_VALUE function,這一切都為你完成。

JSON 響應:

[
  {
    "Id": 3003,
    "AccountNumber": "111111111",
    "BankName": "Wells Fargo",
    "AppId": 111111,
    "CustomerId": "555555",
    "Filename": "some filename.pdf",
    "BusinessName": "Some BusinessName"
  },
  {
    "Id": 3004,
    "AccountNumber": "22222222",
    "BankName": "Wells Fargo",
    "AppId": 111111,
    "CustomerId": "555555",
    "Filename": "Some filename",
    "BusinessName": "Some Businessname"
  },
]

我怎么能 go 關於這樣做? 我還希望能夠復制 SQL 服務器的 CROSS APPLY OPENJSON 功能,以便在將來使用 JSON 對象數組。 我是否需要在 model 中將 BankDataJSON 列定義為 JSON 類型? 當我這樣做時,我收到有關 pyodbcs 無法在 MSSQL 方言中反序列化 JSON 的錯誤

可能你可以嘗試在你的查詢中實現服務器的 function ,像這樣

from sqlalchemy.sql import func


db = SQLAlchemy(app)
BankData = models.bank_data.BankData

qry = db.session.query(BankData.Id, 
     func.JSON_VALUE(BankData.BankDataJSON,'$.AccountName'))

暫無
暫無

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

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