将具有不同键顺序的多个 json 文件插入 postgres table
inserting multiple json files with different key order into postgres table
我有一个 postgresql table,其中有四列,顺序为:created_at、id、author_id、text
我使用推特 API 来获取符合我的条件的推文(Python)。 Twitter API 每次请求仅允许 500 条推文,这意味着如果我的搜索查询 returns 超过 500 条,我必须多次请求 - 就是这种情况。我想在我的 postgres table
中插入 json 个条目
# get column names from json object
columns=[list(x.keys()) for x in response['data']][0] # creates ['created_at','id','author_id','text']
# get the data from the response
data = json_response['data']
# write entries into postgres table
for item in data:
my_data = [item[column] for column in columns]
cur.execute("INSERT INTO tweets VALUES(%s, %s, %s, %s)", tuple(my_data))
现在,如果返回的响应与我的 sql table 的顺序相同,则此方法可以正常工作。但是,json 响应可能具有不同的键顺序。现在可能是 'id'、'author_id'、'text'、'created_at'。
然后我得到一个错误'invalid input syntax for type bigint: ...'
有什么方法可以在插入时保持相同的顺序,即使 json 对象每次都有不同的顺序?
您可以使用 named variables、dict
而不是 tuple
:
my_data = {'created_at': '', 'id': '', 'author_id': '...', 'text': '...'}
cur.execute(
"INSERT INTO tweets VALUES(%(created_at)s, %(id)s, %(author_id)s, %(text)s)",
my_data
)
如果item
中所有的键都存在,你可以简单地传递item
来执行,不需要构建my_data
。
我有一个 postgresql table,其中有四列,顺序为:created_at、id、author_id、text
我使用推特 API 来获取符合我的条件的推文(Python)。 Twitter API 每次请求仅允许 500 条推文,这意味着如果我的搜索查询 returns 超过 500 条,我必须多次请求 - 就是这种情况。我想在我的 postgres table
中插入 json 个条目# get column names from json object
columns=[list(x.keys()) for x in response['data']][0] # creates ['created_at','id','author_id','text']
# get the data from the response
data = json_response['data']
# write entries into postgres table
for item in data:
my_data = [item[column] for column in columns]
cur.execute("INSERT INTO tweets VALUES(%s, %s, %s, %s)", tuple(my_data))
现在,如果返回的响应与我的 sql table 的顺序相同,则此方法可以正常工作。但是,json 响应可能具有不同的键顺序。现在可能是 'id'、'author_id'、'text'、'created_at'。
然后我得到一个错误'invalid input syntax for type bigint: ...'
有什么方法可以在插入时保持相同的顺序,即使 json 对象每次都有不同的顺序?
您可以使用 named variables、dict
而不是 tuple
:
my_data = {'created_at': '', 'id': '', 'author_id': '...', 'text': '...'}
cur.execute(
"INSERT INTO tweets VALUES(%(created_at)s, %(id)s, %(author_id)s, %(text)s)",
my_data
)
如果item
中所有的键都存在,你可以简单地传递item
来执行,不需要构建my_data
。