【问题标题】:JSON response into databaseJSON响应到数据库
【发布时间】:2021-03-07 21:10:26
【问题描述】:

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

我得到一个 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() 

【问题讨论】:

  • 抱歉格式化,我只能格式化一部分代码,但它禁止我发布问题。所以现在它被“格式化”了,但看起来很糟糕,很抱歉
  • 感谢 flakes 的编辑使它看起来很漂亮!
  • 您可以使用sqlalchemy-access 将DataFrame 推送到使用df.to_sql(… , if_exists="append") 的Access 表,而不是将DataFrame 转储到CSV。
  • Gord,你能帮我写一下代码吗?

标签: python json pandas csv ms-access


【解决方案1】:

如果您已经将数据保存在格式良好的 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 方言的维护者。)

【讨论】:

  • 感谢上帝。我只是通过回答我自己的问题来解决它。但是我遇到了一个新问题,似乎在几个地方都在讨论。
【解决方案2】:

用下面的代码解决

SE_export_Tuple = list(zip(SE_export.Name,SE_export.URL,SE_export.ImageUrl,......,SE_export.ID))

print(SE_export_Tuple)

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))

cursor = conn.cursor()
mySql_insert_query="INSERT INTO Temp_table (UnitName,URL,ImageUrl,.......,ID) VALUES (?,?,?,......,?)"
cursor.executemany(mySql_insert_query,SE_export_Tuple)

conn.commit()
conn.close() 

但是,当我添加许多字段时,我在“executemany”处收到错误,说: cursor.executemany(mySql_insert_query,SE_export_Tuple)

错误: ('HY004', '[HY004] [Microsoft][ODBC Microsoft Access Driver]无效的 SQL 数据类型 (67) (SQLBindParameter)')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 2014-01-03
    相关资源
    最近更新 更多