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

在Python中使用JSON创建的SQL数据库中插入字典,python,sql-server,pymssql,Python,Sql Server,Pymssql,我有一个JSON文件,从中读取数据并获得一个字典。我希望将这个完整的字典插入到SQL Server数据库中,以便可以从数据库中作为字典读取 但在插入相同的代码时,我得到一个错误,如下所示 2018年7月13日11:25:00:错误:异常102: “camera”附近的语法不正确。数据库库错误 消息102,严重性15: 常规SQL Server错误:检查来自SQL Server的消息 下面是我的INSERT查询 INSERT INTO hw_info (hostname, peripheralsI

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

但在插入相同的代码时,我得到一个错误,如下所示

2018年7月13日11:25:00:错误:异常102:
“camera”附近的语法不正确。数据库库错误

消息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'}}}')

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

由于它是MySql,您可以尝试将字段设置为TextField,并将JSON转换为字符串并保存它。检索时,可以使用
ast.literal\u 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对象

编辑

这里有两句话

  • prefipheralsInfo=open(peripheralsJsonFile).read()
    在读取后无法正确关闭文件,因此我使用了一个在后台处理该文件的方法

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


  • 您需要用2替换sql中的
    '
    s,这样类似于
    '{u''camera'':{…
    这个查询是如何构建的?使用参数?如果使用
    json.dumps(您的命令)
    并将其作为参数传递到您的查询中,pymssql库应该为您执行所有必要的转义。@JamesZ但不是
    u
    不应该是数据库的一部分,json结构应该直接转储到数据库中。@shmee使用json文件(例如device.json)转储
    外围设备信息使用
    peripheralsInfo=json.loads(open(peripheralsJsonFile).read())
    读取数据,查询准备为
    myquery=“”INSERT-INTO-hw_-info(主机名,外设信息)值('%s','%s')”“”%)(主机名,str(peripheralsInfo))
    @darth\u coder是的,这意味着您从该文件的内容中获取dict。为了将其存储在表中,您需要对其进行序列化。或者,如果您只想拥有整个json结构,请省略
    json.loads()
    并直接从文件中获取json字符串。啊,我看到了您的编辑。是的,只需执行
    peripheralsInfo=open(peripheralsJsonFile)。读取()
    并将其传递给您的查询,而不使用
    str()
    。为了稍后在代码中使用它,您可以从选择的结果中在该字段上使用
    json.loads()
    。OP说的是MS SQL,而不是MySql。当您有一个json字符串时,为什么
    ast.literal\u eval
    json.loads()
    在这种情况下更合适