首页 > 解决方案 > JSON响应到数据库

问题描述

好的,我已经尝试了本网站和其他网站上其他人推荐的几种解决方案。但是,我无法让它像我希望的那样工作。

我得到一个 XML 响应,我对其进行规范化,然后保存到 CSV。第一部分工作正常。我不想将其保存为 CSV,而是将其保存到访问数据库中的现有表中。下面的第二部分:

response = requests.get(u,headers=h).json()
dp = pd.json_normalize(response,'Units')
response_list.append(dp)

export = pd.concat(response_list)
export.to_csv(r'C:\Users\username\Documents\Python Scripts\Test\Test2_'+str(now)+'.csv', index=False, sep=';',encoding='utf-8')

access_path = r"C:\Users\username\Documents\Python Scripts\Test\Test_db.accdb"
conn = pyodbc.connect("DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={};" \
                     .format(access_path))
strSQL = "SELECT * INTO projects2 FROM [text;HDR=Yes;FMT=sep(;);" + \
         "Database=C:\\Users\\username\\Documents\\Python Scripts\\Test].Testdata.csv;"  

cur = conn.cursor()
cur.execute(strSQL)
conn.commit()
conn.close() 

在此处输入图像描述

标签: pythonjsonpandascsvms-access

解决方案


如果您已经将数据保存在格式良好的 pandas DataFrame 中,那么您实际上不需要将其转储到 CSV 文件中;您可以使用sqlalchemy-access方言使用 pandas 的to_sql()方法将数据直接推送到 Access 表中:

from pprint import pprint
import urllib

import pandas as pd
import sqlalchemy as sa

connection_string = (
    r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
    r"DBQ=C:\Users\Public\Database1.accdb;"
    r"ExtendedAnsiSQL=1;"
)
connection_uri = f"access+pyodbc:///?odbc_connect={urllib.parse.quote_plus(connection_string)}"
engine = sa.create_engine(connection_uri)

with engine.begin() as conn:
    # existing data in table
    pprint(
        conn.execute(sa.text("SELECT * FROM user_table")).fetchall(), width=30
    )
    """
    [('gord', 'gord@example.com'),
     ('jennifer', 'jennifer@example.com')]
    """

# DataFrame to insert
df = pd.DataFrame(
    [
        ("newdev", "newdev@example.com"),
        ("newerdev", "newerdev@example.com"),
    ],
    columns=["username", "email"],
)

df.to_sql("user_table", engine, index=False, if_exists="append")

with engine.begin() as conn:
    # updated table
    pprint(
        conn.execute(sa.text("SELECT * FROM user_table")).fetchall(), width=30
    )
    """
    [('gord', 'gord@example.com'),
     ('jennifer', 'jennifer@example.com'),
     ('newdev', 'newdev@example.com'),
     ('newerdev', 'newerdev@example.com')]
    """

(披露:我目前是 sqlalchemy-access 方言的维护者。)


推荐阅读