sqlalchemy to_sql if_exists = "replace" 创建一个具有不同前缀的 table

sqlalchemy to_sql if_exists = "replace" creates a table with different prefix

当我尝试执行以下代码时,它会在数据库中删除实际的 table 但不会重新创建相同的代码。它没有生成 dbo.TableName 类型,而是创建了 username/TableName.

engine = sqlalchemy.create_engine(
    "mssql+pyodbc://server/dbname?driver=ODBC+Driver+13+for+SQL+Server")
df.to_sql("OTD_1_DELIVERY_TRACKING_F_IMPORT", con=engine, if_exists="replace", index=False)

有谁知道如何解决这个问题以便重新创建 dbo.TableName table?

Does anyone know how to fix this so it recreates the dbo.TableName table

发生这种情况是因为用户具有 dbo 以外的默认架构。在非常旧的 SQL 服务器版本中,每个用户都有自己的模式,这是该行为的遗迹。

所以当该用户运行时

DROP TABLE OTD_1_DELIVERY_TRACKING_F_IMPORT

它首先查看用户的默认模式,没有找到任何东西,然后查看 dbo 模式,然后删除 table。但是当用户运行

CREATE TABLE OTD_1_DELIVERY_TRACKING_F_IMPORT ...

它是在用户的默认架构中创建的。

简单的解决方法是将用户的 DEFAULT SCHEMA 更改为 dbo。 EG

ALTER USER [SomeUser] WITH DEFAULT_SCHEMA = dbo;