【发布时间】: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 的错误
【问题讨论】:
-
也许你会对hybrid attributes感兴趣。
标签: python json sql-server sqlalchemy