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

Posted

技术标签:

【中文标题】将字典插入使用 Python 中的 JSON 创建的 SQL 数据库【英文标题】:Insert a dictionary into SQL database created using JSON in Python 【发布时间】:2018-07-13 06:05:19 【问题描述】:

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

但在插入相同的内容时,我收到如下错误。

2018 年 7 月 13 日 11:25:00:错误:异常 102: 'camera'.DB-Lib 错误附近的语法不正确

消息 102,严重性 15: 常规 SQL Server 错误:检查来自 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'')

如何将这个字典插入数据库?

【问题讨论】:

您需要在 sql 中转义 's,将它们替换为 2,例如 'u''camera'': ... 这个查询是如何构建的?使用参数?如果您执行 json.dumps(your_dict) 并将其作为参数传递到您的查询中,pymssql 库应该为您完成所有必要的转义。 @JamesZ 但不是 u' 不应该是数据库的一部分,应该直接将 json 结构转储到数据库中。 @shmee peripheralsInfo 使用 json 文件(例如 device.json)转储,数据使用 peripheralsInfo = json.loads(open(peripheralsJsonFile).read()) 读取,查询准备为 myquery = """INSERT INTO hw_info(hostname, peripheralsInfo) VALUES('%s','%s')""" % (hostname, str(peripheralsInfo)) @darth_coder 是的,这意味着您可以从该文件的内容中获取字典。为了将其存储在您的表中,您需要对其进行序列化。或者,如果您只想拥有整个 json 结构,请省略 json.loads() 并直接从文件中获取 json 字符串。啊,我看到你的编辑了。是的,只需执行 peripheralsInfo = open(peripheralsJsonFile).read() 并在没有 str() 的情况下将其传递给您的查询。为了稍后在代码中使用它,您将在 SELECT 结果中的该字段上json.loads() 【参考方案1】:

要将 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))

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

编辑

这里有两点说明。

    prefipheralsInfo = open(peripheralsJsonFile).read() 在读取后没有正确关闭文件,因此我使用了 context manager 来处理幕后的问题。

    您可以使用 Python 的字符串插值来格式化查询字符串。这会使您的程序容易受到SQL injection attacks 的攻击。在我的示例中,我使用parameterized query 来规避该漏洞。参数还有助于确保将您的输入作为正确的数据类型传递给您的数据库。

【讨论】:

【参考方案2】:

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

如果你使用 PostgreSql,你可以在模型中使用 JSONField。

【讨论】:

OP 说的是 MS SQL,而不是 MySql。当你有一个 json 字符串时,为什么ast.literal_eval 呢? json.loads() 在这种情况下更合适

以上是关于将字典插入使用 Python 中的 JSON 创建的 SQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python 将嵌套字典/json 插入 MySQL 表

如何使用 executemany 将 Python 中的字典列表插入 MySQL

JSON字典到Python中的Pandas DataFrame

将带有数字键的数据插入 mongodb 时出错(python 字典中的 GPS 数据)

如何使用 python 将字典值插入到 html 模板文件中?

Python-将隐藏在列表中的字典转换为数据帧