【问题标题】:How to insert a Pandas Dataframe into a SQL Server synonym table如何将 Pandas 数据框插入 SQL Server 同义词表
【发布时间】:2019-09-26 06:22:24
【问题描述】:

总结

在 SQL Server 中,同义词通常用于将远程表抽象到当前数据库上下文中。普通的 DML 操作在这种结构上工作得很好,但 SQL Server 确实将同义词作为它们自己的对象类型与表分开跟踪。

我正在尝试利用 pandas DataFrame#to_sql 方法来促进加载同义词,虽然当表在数据库本地时它工作得很好,但它无法通过同义词找到表,而是尝试创建一个新的表与 DataFrame 的结构协调,这会导致对象名称冲突和不良行为。

通过源跟踪,pandas 似乎利用了dialect's has_table method,在这种情况下跟踪到SQL Alchemy's MSSQL dialect implementation,然后查询INFORMATION_SCHEMA.columns view 作为验证表是否存在的一种方式。

不幸的是,同义词表不会出现在像这样的INFORMATION_SCHEMA 视图中。在the answer for "How to find all column names of a synonym" 中,回答者提供了一种建立同义词列的技术,此处可能适用。

问题

是否有任何方法可以在DataFrame#to_sql 期间选择性地跳过表存在检查?如果没有,有什么方法可以强制 pandas 或 SQL Alchemy 识别同义词?我在 SO 上找不到任何类似的问题,git 也没有类似的问题。

【问题讨论】:

    标签: python sql-server pandas sqlalchemy flask-sqlalchemy


    【解决方案1】:

    我已经接受了我自己的答案,但如果有人有更好的技术将 DataFrames 加载到 SQL Server 同义词,请发布!

    SQL Server 上的 SQL Alchemy 目前不支持同义词表,这意味着 DataFrame#to_sql 方法无法插入到同义词表中,必须采用另一种技术。

    从 SQL Alchemy 1.2 开始,Oracle dialect supports Synonym/DBLINK Reflection,但没有类似的功能可用于 SQL Server,即使在 upcoming SQL Alchemy 1.4 release 上也是如此。


    对于那些试图以不同方式解决此问题的人,如果您的情况符合以下标准:

    • 您的目标同义词已在 ORM 中声明为表
    • 表的列名与 DataFrame 中的列名匹配
    • 表的列数据类型要么与 DataFrame 匹配,要么可以正确转换

    您可以执行以下bulk_insert_mappings 操作,TargetTable 在 ORM 模型中定义您的目标,df 定义您的 DataFrame:

    db.session.bulk_insert_mappings(
            TargetTable, df.to_dict('records')
    )
    

    另外,这也比DataFrame#to_sql 操作快得多!

    【讨论】:

      猜你喜欢
      • 2012-12-29
      • 2016-07-17
      • 2020-10-04
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多