【问题标题】:Query SQL Server JSON columns using SQLAlchemy使用 SQLAlchemy 查询 SQL Server JSON 列
【发布时间】:2020-03-10 19:26:25
【问题描述】:

我正在寻找一种方法来使用 SQLAlchemy 查询来复制 SQL Server 的 JSON_VALUE 函数的功能。我正在使用 metadata.reflect 在 SQLAlchemy 中定义我现有的数据库表。

SQL:

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

SQLAlchemy 模型:

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 对象 (BankDataJSON) 序列化为 Python 字典,并对其进行解析以获取我想要的值 ('AccountName')。如果我使用 SQL Server 的 JSON_VALUE 函数,这一切都为你完成了。

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"
  },
]

我该怎么做呢?我还希望能够复制 SQL Server 的 CROSS APPLY OPENJSON 功能,以便将来使用 JSON 对象数组。我是否需要在模型中将 BankDataJSON 列定义为 JSON 类型?当我这样做时,我收到一个关于 pyodbcs 无法在 MSSQL 方言中反序列化 JSON 的错误

【问题讨论】:

标签: python json sql-server sqlalchemy


【解决方案1】:

也许你可以尝试在你的查询中实现服务器的功能,像这样

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'))

【讨论】:

  • 谢谢,这行得通!虽然我仍然有兴趣找到一种不直接调用 JSON_VALUE 函数的方法
猜你喜欢
  • 2021-10-18
  • 2016-12-22
  • 2016-05-27
  • 2018-01-23
  • 1970-01-01
  • 2023-03-18
  • 2022-11-09
  • 2021-11-07
  • 2016-12-01
相关资源
最近更新 更多