在Python 3.6中,我有一个变量' data2 ',其中包含一个如下所示的JSON:
{
'id': 4573457, 'account_id': 456, 'address': '15 Millers Rd, WA',
'category_id': 4565, 'description': None, 'is_anonymous': False,
'iso_created_at': '2017-11-21T14:08:54+11:00',
'location': {
'latitude': -56.564848493, 'longitude': 345.5948493},
'report_state_id': 45655, 'report_state_name': 'ALL PICKED',
'title': 'South', 'user_id': 44555, 'user_short_name': 'Todd G.',
'users_alerted_count': 0, 'users_opened_count': 6, 'shape_id': 56
}
我想写一个INSERT语句到这个数据插入到我已经在创建表的Postgres 9.5,该表有3列-通道,REPORT_ID和report_data -
我想将JSON中的'account_id'插入channel列,将'id'插入report_id列,并将JSON的其余部分全部插入report_data列。
有人可以告诉我我该怎么做吗?
这是在Postgres中提取JSON值的基本方法:
data2->'account_id' AS channel
因此,您的执行SQL应该是这样的:
cursor.execute("
INSERT INTO MyTable (channel, report_id, report_data)
SELECT
src.MyJSON->'account_id',
src.MyJSON->'id',
src.MyJSON
FROM (
SELECT %s AS MyJSON
) src
",
(data2,)
)
如果您想在将其余的JSON插入report_data字段之前删除account_id / id键,则可以创建第二个“ data2”变量(例如,“ data2_final”),并将其作为参数传递给您的SQL,让我知道它如何为您工作。
更新
CREATE TABLE Mytable (
channel INTEGER,
report_id INTEGER,
report_data JSONB
);
cursor.execute("
INSERT INTO MyTable (channel, report_id, report_data)
SELECT
CAST(src.MyJSON->>'account_id' AS INTEGER),
CAST(src.MyJSON->>'id' AS INTEGER),
src.MyJSON
FROM (
SELECT CAST(%s AS JSONB) AS MyJSON
) src
",
(data2,)
)
http://www.sqlfiddle.com/#!17/fb3af/1
我更新了提取内容以将JSON值返回为文本,然后将其强制转换为INTEGER。
更新的更新我理解了我在下面所做的更改,从而在下面格式化了您的代码:
def calldb( db, sql_cmd):
try:
cur = db.cursor()
cur.execute(sql_cmd, (data2,))
return
except Exception as e:
print ('Error ', e )
raise
sql_cmd=" INSERT INTO MyTable (channel, report_id, report_data) SELECT CAST(src.MyJSON->>'account_id' AS INTEGER), CAST(src.MyJSON->>'id' AS INTEGER), src.MyJSON FROM ( SELECT CAST(%s AS JSONB) AS MyJSON ) src"
calldb(conn, sql_cmd)
conn.commit()
变化:
execute()函数的工作方式是,将要执行的SQL字符串(即sql_cmd)作为第一个参数传递给它。字符串中的%s项目是参数化值的占位符。作为第二个参数,您传递一个包含参数值(即(data2,))的数组/元组。
手指交叉:)
更新的更新的更新
这里是工作代码(从您提供的内容略作修改的版本):
import psycopg2
import json
def calldb(db, sql_cmd, sql_params):
try:
cur = db.cursor()
cur.execute(sql_cmd, sql_params)
return
except Exception as e:
print ('Error ', e )
raise
params = {
"host":"DB_HOSTNAME",
"database":"DB_NAME",
"user":"USERNAME",
"password":"PASSWORD"
}
conn = psycopg2.connect(**params)
# Prepare SQL
sql_cmd = "INSERT INTO MyTable (channel, report_id, report_data) SELECT CAST(src.MyJSON->>'account_id' AS INTEGER), CAST(src.MyJSON->>'id' AS INTEGER), src.MyJSON FROM ( SELECT CAST(%s AS JSONB) AS MyJSON ) src"
# Convert dictionary to native JSON data type
data2 = {"id": 4573457, "account_id": 456, "address": "15 Millers Rd, WA"}
data2_json = json.dumps(data2)
sql_params = (data2_json,)
# Execute SQL
calldb(conn, sql_cmd, sql_params)
conn.commit()
变化
您可以清理它并根据需要进行修改。试试看,让我知道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句