sqlalchemy to_ sql if_exists = "replace" создает таблицу с другим префиксом - PullRequest
0 голосов
/ 30 марта 2020

Когда я пытаюсь выполнить следующий код, он удаляет фактическую таблицу в базе данных, но не воссоздает ту же самую. Вместо генерации типа 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?

1 Ответ

0 голосов
/ 30 марта 2020

Кто-нибудь знает, как это исправить, чтобы воссоздать таблицу dbo.TableName

Это происходит потому, что у пользователя есть схема по умолчанию, отличная от dbo. В очень старых версиях SQL Server у каждого пользователя была своя собственная схема, и это является следствием такого поведения.

Так что, когда этот пользователь запускает

DROP TABLE OTD_1_DELIVERY_TRACKING_F_IMPORT

, он смотрит в пользователя сначала схема по умолчанию, но ничего не находит, затем просматривает схему dbo и удаляет эту таблицу. Но когда пользователь запускает

CREATE TABLE OTD_1_DELIVERY_TRACKING_F_IMPORT ...

Он создается в пользовательской схеме по умолчанию.

Простое решение - изменить DEFAULT SCHEMA пользователя на dbo. EG

ALTER USER [SomeUser] WITH DEFAULT_SCHEMA = dbo;
...