如何将Pandas Dataframe插入SQL Server同义词表

时间:2019-05-08 13:34:12

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

摘要

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

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

跟踪源代码,熊猫似乎利用了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期间跳过表存在性检查?如果不是,是否有任何方法可以强制熊猫或SQL Alchemy识别同义词?我在SO上找不到任何类似的问题,而且git都没有类似的问题。

1 个答案:

答案 0 :(得分:0)

  

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

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

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


对于那些尝试以不同方式解决此问题的人,如果您的情况满足以下条件:

  • 您的目标同义词已经在ORM中声明为表格
  • 表的列名称与DataFrame中的列名称匹配
  • 表的列数据类型要么与DataFrame匹配,要么可以进行强制转换而没有错误

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

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

作为奖励,这也比DataFrame#to_sql操作要快得多!