我想将批量数据存储到postgresql。我得到的数据来自谷歌分析[API]。数据是关于页面浏览量的,这是我的代码:
data = '[["20151201","path","title",345], ["20151202","path","title",321], ["20151203","path","title",214]]'
def storeJson( jsonFile, tableName ):
conn = psycopg2.connect( host=hostname, user=username, password=password, dbname=database )
try:
cur = conn.cursor()
# Here is the problem:
cur.executemany( "INSERT INTO " + tableName + " VALUES(%s)", [jsonFile])
conn.commit()
except psycopg2.DatabaseError as e:
if conn:
conn.rollback()
print("Error %s" %e)
exit()
finally:
if conn:
cur.close()
conn.close()
def main()
storeJson(data, "daily_pageviews")
if __name__ == '__main__':
main()
使用上面的代码,我得到了这样的错误消息:
json.decoder.JSONDecodeError:应为":"分隔符:第1行第12列(字符11)
有人能启发我吗?谢谢大家!
最后,情况如下:首先,我的数据不是json格式,而是列表格式的列表。以下是我从朋友那里得到的使用sqlalchemy的解决方案:
from sqlalchemy.engine import create_engine
from sqlalchemy.schema import MetaData, Table
engine = create_engine('postgresql://db_username:db_password@ip/dbname')
metadata = MetaData()
metadata.bind = engine
def storeJson( jsonFile, tableName ):
table = Table(tableName, metadata, autoload=True)
#import ipdb; ipdb.set_trace()
def to_dicts(rows):
for row in rows:
data = {}
for i, column in enumerate(table.columns):
data[column.name] = row[i]
yield data
params = list(to_dicts(jsonFile))
engine.execute(table.insert(), params)
return
假设jsonFile列表的值与db上的表完全相同。注意:您可以使用pip 安装sqlalchemy
python-m pip安装sqlalchemy--用户
至于"如何"从谷歌分析中获取数据,你可以访问它的网站:https://developers.google.com/analytics/devguides/reporting/core/v3/quickstart/service-py
jsonFile
在您的情况下是一个字符串。您需要加载json.loads()
:
import json
data = json.loads(jsonFile)
cur.executemany("INSERT INTO " + tableName + " VALUES(%s, %s, %s, %s)", data)
请注意,我在查询中有4个占位符,每个占位符用于每个子列表中的每个项。