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;
解释:
上面的代码是以函数格式编写的,以便更好地表示整个过程中发生的底层步骤。 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()
输出:
在上面的代码中,我们试图插入一个新的 JSON 条目,id 为JSON002 。除了我们使用psycopg2.extras.Json而不是json.dumps之外,整个过程与之前的代码相同。