在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都没有类似的问题。
答案 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也没有类似的功能。
对于那些尝试以不同方式解决此问题的人,如果您的情况满足以下条件:
您可以执行以下bulk_insert_mappings
操作,其中TargetTable
定义ORM模型中的目标,而df
定义DataFrame:
db.session.bulk_insert_mappings(
TargetTable, df.to_dict('records')
)
作为奖励,这也比DataFrame#to_sql
操作要快得多!