TSQL с SQLAlchemy не выполняется

Я пытаюсь выполнить запросы TSQL в удаленной базе данных MSSQL, используя SQLAlchemy и pymssql. Я проверил свой процедурный запрос непосредственно в базе данных, и он работает так, как предполагалось, он также работает, если я запускаю его непосредственно через pymssql. Если я запускаю обычные однострочные запросы, такие как:

select table_name from INFORMATION_SCHEMA.tables

Через SQLAlchemy это тоже работает как надо. Но когда я пытаюсь выполнить следующий запрос TSQL, он фактически не создает таблицу:

IF NOT EXISTS (SELECT * 
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = 'SOME_TABLE')
BEGIN
   CREATE TABLE SOME_TABLE (SOME_TEXT VARCHAR(255), SOME_TIME DATETIME)
END

он запускает его, поскольку он был успешным, и если я пытаюсь прочитать результат из выполнения, он выдает мне «Ошибка уже закрытого ресурса», как и ожидалось, поскольку это запрос CREATE. Однако, если я попытаюсь добавить данные в таблицу «SOME_TABLE», меня вырвет и скажет, что таблица не существует. Такое ощущение, что он только загружает запрос как функцию, но никогда не выполняет его. Любые идеи? Или даже лучше; Запросы TSQL, которые действительно работают при выполнении с помощью SQLAlchemy и pymssql.

Спасибо,


person Robin Rye    schedule 03.09.2013    source источник
comment
Похоже на проблему с транзакцией. Вы забыли commit свою сессию в конце?   -  person javex    schedule 04.09.2013
comment
@javex Я не уверен, нужно ли вам делать это в SQLAlchemy, поскольку однострочные запросы в любом случае работают правильно. Если я ошибаюсь, не могли бы вы указать мне на документы sqlalchemy, потому что я пытался найти там фиксацию.   -  person Robin Rye    schedule 04.09.2013
comment
Введение Использование сеанса является обязательным для прочтения. В вашем примере вы выполняете однострочную операцию SELECT, которая не изменяет таблицу и, следовательно, не требует фиксации. Однако, если вы что-то меняете, вам обязательно нужно зафиксировать (если не в режиме автоматической фиксации). Возможно, вы захотите прочитать, что транзакция в целом прошла хорошо. Однако очень важно понимать транзакцию SQLAlchemy, чтобы правильно использовать ORM.   -  person javex    schedule 04.09.2013
comment
Работал как шарм! Спасибо @javex! Добавьте это как ответ, если хотите, чтобы я принял его.   -  person Robin Rye    schedule 05.09.2013
comment
Я добавил это как ответ   -  person javex    schedule 05.09.2013


Ответы (2)


Вам необходимо зафиксировать ожидающие изменения в Session. Для общего понимания процесса прочитайте Использование сеанса. Быстрое решение:

session.commit()
person javex    schedule 05.09.2013
comment
Просто чтобы уточнить для будущих читателей, я вообще не использовал сеансы, а вместо этого использовал соединение из движка и запустил connection.execute(), а затем нет commit(). Таким образом, создайте движок, создайте сеанс, а затем используйте session.execute() и session.commit(). - person Robin Rye; 06.09.2013

ВРЕМЯ и ТЕКСТ являются резервными словами.

Я не знаю, как SQL Alchemy или pymmsql общаются с SQL Server. Либо родной клиент, либо ODBC. В конечном итоге все сводится к потоку табличных данных (TDS) по сетевому протоколу, такому как TCP/IP.

Ознакомьтесь со списком зарезервированных слов на сайте TECHNET.

-- Create table ?
IF OBJECT_ID('DBO.SOMETABLE') IS NULL 
  CREATE TABLE DBO.SOMETABLE (MY_TEXT VARCHAR(255), MY_TIME DATETIME);

Я использую функцию OBJECT_ID, так как она меньше печатает.

Но NOT EXITS работает как с SELECT FROM из sys.objects, так и с information_schema.tables с правильными предложениями WHERE.

person CRAFTY DBA    schedule 04.09.2013
comment
Хорошо, спасибо за ответ, но извините, я просто выбрал эти слова произвольно, так как фактические имена столбцов не важны. Я обновлю свой вопрос с именами, не являющимися ключевыми словами! - person Robin Rye; 04.09.2013