在 Python 中使用 JSON 创建的 SQL 数据库中插入字典

Insert a dictionary into SQL database created using JSON in Python

我有一个 JSON 文件,我从中读取数据并获取字典 我希望将这个完整的字典插入到 SQL 服务器数据库中,以便可以将其作为字典读取来自数据库。

但是在插入相同的内容时,出现如下错误。

07/13/2018 11:25:00: ERROR: Exception 102:
Incorrect syntax near 'camera'.DB-Lib error

Msg 102, severity 15:
General SQL Server error: Check messages from the SQL Server

下面是我的 INSERT 查询。

INSERT INTO hw_info (hostname, peripheralsInfo)
VALUES ('linux-host', '{u'camera': {u'ab': {u'model': u'Model1', u'version': u'Version1', u'selectorMask': u'Data1'}, u'cd': {u'model': u'Model2', u'version': u'Version2', u'selectorMask': u'Data2'}}}')

如何将此字典插入数据库?

因为是MySql,您尝试将字段设置为TextField并将JSON转换为字符串并保存。检索时,您可以使用 ast.literal_eval(fieldName).

如果您使用的是 PostgreSql,则可以在模型中使用 JSON字段。

要将 json 插入到您的数据库中,请不要将其转换为 Python 对象;只存储从文件中读取的字符串。

with open(peripheralsJsonFile).read() as f:
    peripheralsInfo = f.read()

myquery = """INSERT INTO hw_info(hostname, peripheralsInfo) VALUES(%s,%s)""" 

cursor.execute(myquery, (hostname, peripheralsInfo))

当您想稍后在程序中使用数据时,您可以通过 json.loads() 传递来自 SELECT 查询的字符串,使其成为 Python 对象。

编辑

这里有两点说明。

  1. prefipheralsInfo = open(peripheralsJsonFile).read() 阅读后无法正确关闭文件,因此我使用了 context manager 在幕后处理这个问题。

  2. 您使用 Python 的字符串插值来格式化您的查询字符串。这使您的程序容易受到 SQL injection attacks. In my example I make use of a parameterized query 的攻击以规避该漏洞。参数还有助于确保您的输入作为正确的数据类型传递给您的数据库。