Невозможно изменить имена столбцов с помощью Pandas и SQLAlchemy в процессе ETL с CSV на SQL БД сервера - PullRequest
1 голос
/ 13 марта 2020

Я использую engine.execute () для запуска raw SQL, чтобы изменить имя столбца в SQL Сервер, например, так:

engine.execute('exec sp_rename 'table_name."Old Column Name"', 'NewColumnName', 'COLUMN'')

Я не получаю никаких ошибок и журналов показать строку, которую я пытаюсь выполнить, но изменения не отражены в таблице.

Просмотр журналов:

2020-03-16 09:33:15,671 INFO sqlalchemy.engine.base.Engine exec sp_rename 'table_name."Old Column Name"', 'NewColumnName', 'COLUMN'
2020-03-16 09:33:15,671 INFO sqlalchemy.engine.base.Engine ()
2020-03-16 09:33:15,769 INFO sqlalchemy.engine.base.Engine ALTER TABLE table_name ALTER COLUMN [Column Name] date
2020-03-16 09:33:15,769 INFO sqlalchemy.engine.base.Engine ()
2020-03-16 09:33:15,773 INFO sqlalchemy.engine.base.Engine COMMIT

Показывает, где я пытаюсь переименовать столбец. но это не обязывает. После этого он показывает, где я меняю тип данных столбца, и показывает, что он фиксирует. Если я скопирую строку, которую я пытаюсь выполнить из журналов, в консоль DataGrip и запустю ее, изменение имени будет успешным.

Примечание. Все имена столбцов из CSV имеют пробелы, и многие имеют специальные персонажи. Окружение имен столбцов в скобках позаботилось об этой проблеме в других местах, где я выполняю raw SQL. Я экспериментировал со скобками и двойными кавычками в консоли DataGrip, поэтому я не думаю, что это проблема в этом случае. Я, конечно, могу ошибаться.

Любая помощь приветствуется.

python 2,7

pandas 0,20,3

sqlalchemy 1.3.13

1 Ответ

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

Итак, после почти недели работы над этой проблемой я нашел решение. Пока не знаю почему, но использование engine.execute () с sp_rename не зафиксировало транзакцию. Я должен был зафиксировать транзакцию, создав сеанс и явно зафиксировав. Это выглядит примерно так:

engine = create_engine('your_db_url')
Session = sessionmaker(bind=engine)

session = Session()
session.execute('exec sp_rename 'table_name."Old Column Name"', 'NewColumnName', 'COLUMN'')
session.commit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...