【问题标题】:How do I turn returned python JSON dictionary in a list in dictionary, data into a SQL insert如何将字典列表中返回的python JSON字典,数据转换为SQL插入
【发布时间】:2019-11-08 00:55:25
【问题描述】:

给定示例 JSON 数据,其中包含一个 Dictionary 和一个 List,其中包含另一个字典的密钥对集:

MyData={
    'Key1': 'Value 1', 
    'Key2': Value2, 
    'Key3': Value3, 
    'Key4': 
            [
            {
              "SubKey1": "SubValue",
              "SubKey2": "SubValue",
              "SubKey3": "SubValue",
              "SubKey1": "SubValue"
            },
            {
              "SubKey1": "SubValue",
              "SubKey2": "SubValue",
              "SubKey3": "SubValue",
              "SubKey1": "SubValue"
            },
            {
              "SubKey1": "SubValue",
              "SubKey2": "SubValue",
              "SubKey3": "SubValue",
              "SubKey1": "SubValue"
            }
          ]
        }

如何将其转换为正确的 SQL 插入?

我找到了一个可以进行单次插入的 SQL,而且它似乎运行良好:

columns = ', '.join("'" + str(x).replace('/', '_') + "'" for x in MyData.keys())
values = ', '.join("'" + str(x).replace('/', '_') + "'" for x in MyData.values())
sql = "INSERT INTO %s ( %s ) VALUES ( %s );" % ('mytable', columns, values)
print(sql)

但它只在其中创建 1 行插入

我正在寻找的是 Key1,Key2,Key3 与 3 个子值一起插入了 3 次(注意可以多于或少于 3 个)。

我会注意到这是对返回 JSON 数据的 API 的 Python 3 调用。

谢谢

【问题讨论】:

  • 表结构是什么样的?似乎Key4 应该在另一个具有外键关系的表中。
  • 假设你的表有 key1、key2 和 key3 列,你的数据只会创建一行,即你的最终查询看起来像 insert into mytable (key1, key2 and key3) values('Value 1', 'Value 2', 'Value 3',) 你为什么期望 3 个插入?分享你的表结构..
  • 好点,Key4 值可以在单独的表中。那么在这种情况下,我将如何完成插入 3 个键值、获取 SQL 本地 KeyID 并在新表中创建插入以及外键?我可以使表结构符合我的要求,但鉴于我们在这里所说的,它类似于 2 个表,其中 table1 有 3 列,table2 有 5 列,其中一个是外键。我还想插入 ID 和日期时间戳。 Id 可以自动递增,但不确定使用这些方法的时间戳(通常只是 getdate()。

标签: python sql json api dictionary


【解决方案1】:

为了记录,我要做的是回到我原来的 SQL 插入方法,使用通过 Python 创建的 SQL 连接并为第一个表创建单个插入。然后遍历 key4 值并为第二个表创建插入(这样它将根据返回值的计数动态插入我的行。

类似这样的:

创建我的连接

conn = pyodbc.connect('Driver={SQL Server};'
                          'Server=.\........;'
                          'Database=MyDatabase;'
                          'Trusted_Connection=yes;')

    cursor = conn.cursor()
    cursor.execute('''
                    @InsertSQLVariable (insert into MyTable values .... )
                    ''')
    conn.commit()

那我就通过上面提到的@InsertSQLVariable创建:

print("insert into Table1 values ('",\
      MyData["Key1"],"',",\
      MyData["Key2"],")",\
      MyData["Key2"],"'",\
      sep='')

然后如上所述遍历键值并为第二个表创建插入:

for i in MyData["Key4"]:
    print("insert into Table2 values ('",\
          i["SubKey1"],"',",\
          i["SubKey2"],"',",\
          i["SubKey3"],"',",\
          i["SubKey4"],"',",\
          sep='')

补充几点:

  • 这一行:sep='' - 删除 python 打印函数末尾的空格,一旦将其设置为变量,我可能必须将其删除。
  • 当我键入时,我意识到在第二个表查询中,我仍然需要从第一个表插入中获取标识,以便获得表的键。
  • 我使用 print 而不是 SQLInsert 变量只是为了证明我能够成功创建我的插入语句。
  • SQL 插入语法需求非常粗略,并且肯定仍然存在,因为我仍在构建它,但我认为我有足够的能力证明我现在能够满足我的需求。我想完成这篇文章来支持 StackOverflow,因为他们过去有时会帮助我......你可能会在不久的将来再次见到我 :)

感谢 StackOverflow 和所有为它做出贡献的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 2014-02-26
    • 1970-01-01
    • 2015-07-23
    • 2019-02-10
    • 2022-12-05
    相关资源
    最近更新 更多