当前位置: 首页 > 面试题库 >

如何将pandas DataFrame升级到Microsoft SQL Server表?

钱元徽
2023-03-14
问题内容

我想将我的pandas DataFrame插入到SQL
Server表中。这个问题为PostgreSQL提供了一个可行的解决方案,但T-
SQL没有的ON CONFLICT变体INSERT。如何为SQL Server完成同一件事?


问题答案:

有两种选择:

  1. 使用MERGE语句代替INSERT ... ON CONFLICT
  2. 使用UPDATE带a的语句JOIN,后跟条件语句INSERT

MERGE的T-SQL文档说:

性能提示:当两个表具有匹配特征的复杂混合时,为MERGE语句描述的条件行为最有效。例如,如果不存在则插入行,或者如果匹配则更新行。当仅基于另一个表的行更新一个表时,可使用基本的INSERT,UPDATE和DELETE语句提高性能和可伸缩性。

在许多情况下,仅使用分隔符UPDATEINSERT语句会更快,更简单。

engine = sa.create_engine(
    connection_uri, fast_executemany=True, isolation_level="SERIALIZABLE"
)

with engine.begin() as conn:
    # step 0.0 - create test environment
    conn.execute(sa.text("DROP TABLE IF EXISTS main_table"))
    conn.execute(
        sa.text(
            "CREATE TABLE main_table (id int primary key, txt varchar(50))"
        )
    )
    conn.execute(
        sa.text(
            "INSERT INTO main_table (id, txt) VALUES (1, 'row 1 old text')"
        )
    )
    # step 0.1 - create DataFrame to UPSERT
    df = pd.DataFrame(
        [(2, "new row 2 text"), (1, "row 1 new text")], columns=["id", "txt"]
    )

    # step 1 - upload DataFrame to temporary table
    df.to_sql("#temp_table", conn, index=False, if_exists="replace")

    # step 2 - merge temp_table into main_table
    conn.execute(
        sa.text("""\
            UPDATE main SET main.txt = temp.txt
            FROM main_table main INNER JOIN #temp_table temp
                ON main.id = temp.id
            """
        )
    )
    conn.execute(
        sa.text("""\
            INSERT INTO main_table (id, txt) 
            SELECT id, txt FROM #temp_table
            WHERE id NOT IN (SELECT id FROM main_table) 
            """
        )
    )

    # step 3 - confirm results
    result = conn.execute(sa.text("SELECT * FROM main_table ORDER BY id")).fetchall()
    print(result)  # [(1, 'row 1 new text'), (2, 'new row 2 text')]


 类似资料:
  • 问题内容: 我已经从网络资源中抓取了一些数据并将其全部存储在pandas DataFrame中。现在,为了利用SQLAlchemy提供的强大的db工具,我想将所说的DataFrame转换为Table()对象,并最终将所有数据上载到PostgreSQL表中。如果可行,那么完成此任务的可行方法是什么? 问题答案: 如果您使用的是PostgreSQL 9.5或更高版本,则可以使用临时表和一条语句执行UP

  • 我正在尝试将log4j升级到log4j2。我试图升级的特定代码行是: 静态字段在新的中不再可用。相反,似乎使用了静态方法来访问优先级int值,可以将指定为。 但是,此方法还需要指定。在调用时,如何知道要指定哪个? 旧优先级:https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/priority.html 新优先级:https:/

  • 升级准备工作: pika在2.3.3版本时为了确保同步的可靠性,增加了server-id验证功能,因此pika2.3.3~pika2.3.6与pika2.3.3之前的版本无法互相同步 如果你的pika版本<2.3.3, 你需要准备pika2.3.6及pika3.0.16的bin文件,这里需要注意的是3.0.x需要准备3.0.16以后的版本(或者3.0.6版本),其他版本pika不再能与低版本(2.

  • 问题内容: 我最近注意到我正在运行的旧版AWS CLI缺少我需要的某些功能: 如何升级到最新版本的AWS CLI(1.10.24)? 编辑: 运行以下命令无法更新AWS CLI: 检查版本: 问题答案: 要升级AWS CLI,只需使用:

  • 在Xamarin的最新更新之后,我在设计视图中得到了这个错误 “安装的Android SDK太旧。需要25.1.3或更高版本。” 运行“Open Android SDK”和安装最新版本的Android Studio并没有解决这个问题。

  • 我花了5个多小时关注google、GitHub和StackOverflow的东西。仍然无法将Android SDK版本升级到29.0.3。 在flutter doctor中,它显示了Android SDK29.0.3的未完全安装,但是当我创建一个flutter项目时,它会自动检测旧版本(28.0.3),并试图安装旧版本,而不是新版本。 这是颤振医生。颤振医生命令