📜  Psycopg2 - 将字典插入为 JSON

📅  最后修改于: 2022-05-13 01:55:31.077000             🧑  作者: Mango

Psycopg2 - 将字典插入为 JSON

在本文中,我们将看到如何使用 Psycopg2 和Python将字典作为 JSON 插入。

Python dict 对象可以或者更确切地说应该作为 JSON 数据类型存储在数据库表中。由于大多数 SQL 数据库都有 JSON 数据类型。这允许在前端或 API 中使用这些对象或键值对来分别处理从它们发出的请求。

设置 PostgreSQL 数据库和表:

让我们在 PostgreSQL 中创建一个模式,并向其中添加一个至少包含一个 JSON 类型列的表。我们可以使用以下 SQL 脚本来创建相同的。

在上面的 SQL 脚本中,我们创建了一个模式名称“geeks”。在模式中创建了一个表“json_example”,它由两列组成,一个是主键,列名为“id”,而另一列名为“json_col”,类型为 JSON。



使用 psycopg2 库在 PostgreSQL 表中插入一个Python dict 对象:

Python
import json
import psycopg2
  
# SAVE THE DB CONFIG IN A DICT OBJECT
DATABASE_CONFIG = {
    "database": "geeks",
    "user": "postgres",
    "password": "password",
    "host": "localhost",
    "port":  5432,
}
  
  
def get_connection():
  
    # RETURN THE CONNECTION OBJECT
    return psycopg2.connect(
        database=DATABASE_CONFIG.get('database'),
        user=DATABASE_CONFIG.get('user'),
        password=DATABASE_CONFIG.get('password'),
        host=DATABASE_CONFIG.get('host'),
        port=DATABASE_CONFIG.get('port'),
    )
  
  
def dict_to_json(value: dict):
  
    # CONVERT DICT TO A JSON STRING AND RETURN
    return json.dumps(value)
  
  
def insert_value(id: str, json_col: str, conn):
  
    # CREATE A CURSOR USING THE CONNECTION OBJECT
    curr = conn.cursor()
  
    # EXECUTE THE INSERT QUERY
    curr.execute(f'''
        INSERT INTO
            json_table(id, json_col) 
        VALUES
            ('JSON001', '{json_col}')
    ''')
  
    # COMMIT THE ABOVE REQUESTS
    conn.commit()
  
    # CLOSE THE CONNECTION
    conn.close()
  
  
def main():
  
    # CREATE A PSYCOPG2 CONNECTION
    conn = get_connection()
  
    # CREATE A PYTHON DICT OBJECT FOR JSON COL
    dict_obj = {
        "name": "Amit Pathak",
        "skill": "Python",
        "experience": 4
    }
  
    # CONVERT DICT OBJECT TO JSON STRING
    json_obj = dict_to_json(value=dict_obj)
  
    # INSERT VALUES IN THE DATABASE TABLE
    insert_value(id='JSON001', json_col=json_obj,
                 conn=conn)
  
if __name__ == '__main__':
    main()


Python
import psycopg2
from psycopg2.extras import Json
  
  
# CREATE A PSYCOPG2 CONNECTION
conn = psycopg2.connect(**{
    "database" : "geeks",
    "user"     : "postgres",
    "password" : "password",
    "host"     : "localhost",
    "port"     :  5432,
})
  
# CREATE DICT OBJECT TO BE INSERTED TO DB
dict_obj = {
    "name": "Suhas Hegde",
    "skill": "PL/SQL",
    "experience": 3
}
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE INSERT QUERY
curr.execute(f'''
    INSERT INTO
        json_table(id, json_col) 
    VALUES
        ('JSON002', %s)
''', [Json(dict_obj)])
  
# COMMIT THE REQUESTS IN QUEUE
conn.commit()
  
# CLOSE THE CONNECTION
conn.close()


运行上述Python文件后,我们可以前往 pgAdmin 在公共模式下的json_table表中查看以下输出。您可以在查询工具中运行以下 SQL 脚本 -

$ SELECT * FROM json_table;

在 pgAdmin 中查看的输出

解释:

上面的代码是以函数格式编写的,以便更好地表示整个过程中发生的底层步骤。 get_connection()函数将连接对象返回到 PostgreSQL 表,我们可以使用它建立到数据库的连接以进行操作。如果无法建立连接对象,它将返回False 。现在,我们在变量名dict_obj 中创建了一个Python dict 对象。我们将把这个 dict 对象插入到数据库中。但是,在我们插入这个 dict 对象之前,我们需要将对象转换为 JSON 格式,因为数据库理解 JSON 格式而不是Python dict 对象。 Python 的内置模块json用于使用dumps()方法将 dict 对象转换为 JSON字符串格式。现在我们有了 JSON字符串和连接对象,我们可以在数据库表json_table 中插入数据。为此,我们创建了一个名为insert_value()的函数,它接受 3 个参数,即 id 表示要插入 id 列的值, json_col表示需要插入json_col列的值,以及conn参数用于提供之前创建的连接对象。我们可以看到 insert_value()函数使用连接对象运行通常的INSERT SQL 脚本。一旦数据被插入到表中,连接就会关闭。

使用 psycopg2 Json 适配

下面的代码演示了如何使用 psycopg2 的Json适配来代替标准的json.dumps() 。为了将Python对象作为查询参数传递给数据库,您可以使用从psycopg2.extras导入的Json适配器。

Python

import psycopg2
from psycopg2.extras import Json
  
  
# CREATE A PSYCOPG2 CONNECTION
conn = psycopg2.connect(**{
    "database" : "geeks",
    "user"     : "postgres",
    "password" : "password",
    "host"     : "localhost",
    "port"     :  5432,
})
  
# CREATE DICT OBJECT TO BE INSERTED TO DB
dict_obj = {
    "name": "Suhas Hegde",
    "skill": "PL/SQL",
    "experience": 3
}
  
# CREATE A CURSOR USING THE CONNECTION OBJECT
curr = conn.cursor()
  
# EXECUTE THE INSERT QUERY
curr.execute(f'''
    INSERT INTO
        json_table(id, json_col) 
    VALUES
        ('JSON002', %s)
''', [Json(dict_obj)])
  
# COMMIT THE REQUESTS IN QUEUE
conn.commit()
  
# CLOSE THE CONNECTION
conn.close()

输出:

在 pgAdmin 中查看的输出

在上面的代码中,我们试图插入一个新的 JSON 条目,id 为JSON002 。除了我们使用psycopg2.extras.Json而不是json.dumps之外,整个过程与之前的代码相同。