pymssql (модуль python) не может использовать временные таблицы - PullRequest
0 голосов
/ 10 января 2012

Это не вопрос, а упреждающий ответ. (Я получил много помощи от этого сайта и хотел вернуть.)

Я боролся с большим количеством SQL-запросов, которые не выполнялись, когда я пытался запустить его через python с использованием pymssql, но работал нормально, когда напрямую через MS SQL. (Например, в моем случае я использовал MS SQL Server Management Studio для запуска вне Python.)

Тогда я наконец обнаружил проблему: pymssql не может обрабатывать временные таблицы. По крайней мере, не моя версия, которая все еще 1.0.1.

В качестве доказательства приведен фрагмент моего кода, слегка измененный для защиты от любых проблем с IP:

conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
                       database=sqlDB)
cur = conn.cursor()
cur.execute(testQuery)

Вышеприведенный код FAILS (не возвращает никаких данных, если быть точным, и выдает ошибку "pymssql.OperationalError: No data available.", если вы вызываете cur.fetchone()), если я вызываю его с testQuery, определенным следующим образом:

testQuery = """
CREATE TABLE #TEST (
[sample_id] varchar (256)
,[blah] varchar (256) )
INSERT INTO #TEST
SELECT DISTINCT
        [sample_id]
        ,[blah]
FROM [myTableOI]
WHERE [Shipment Type] in ('test')

SELECT * FROM #TEST
"""

Тем не менее, он работает нормально, если testQuery определено, как показано ниже.

testQuery = """
SELECT DISTINCT
        [sample_id]
        ,[blah]
FROM [myTableOI]
WHERE [Shipment Type] in ('test')

"""

Я выполнил поиск в Google, а также в Stack Overflow и не смог найти никакой информации, касающейся конкретной проблемы. Я также посмотрел документацию и FAQ по pymssql, найденную по адресу http://code.google.com/p/pymssql/wiki/FAQ, и не увидел ничего, что упоминало бы, что временные таблицы не допускаются. Поэтому я решил добавить этот «вопрос».

Ответы [ 2 ]

2 голосов
/ 23 июля 2016

Обновление: июль 2016

Ранее принятый ответ больше не действителен. Второй пример «НЕ будет работать» действительно работает с pymssql 2.1.1 в Python 2.7.11 (после замены conn.autocommit(1) на conn.autocommit(True), чтобы избежать «TypeError: Невозможно преобразовать int в bool»).

1 голос
/ 13 января 2012

Для тех, кто сталкивался с этим вопросом и, возможно, сталкивался с подобными проблемами, я подумал, что передам то, что узнал со времени публикации. Оказывается, вы можете использовать временные таблицы в pymssql, но вы должны быть очень осторожны в обработке коммитов.

Сначала я объясню на примере. Будет работать следующий код:

testQuery = """
CREATE TABLE #TEST (
[name] varchar(256)
,[age] int )

INSERT INTO #TEST
values ('Mike', 12)
,('someone else', 904)

"""

conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
    database=sqlDB) ## obviously setting up proper variables here...
conn.autocommit(1)
cur = conn.cursor()
cur.execute(testQuery)
cur.execute("SELECT * FROM #TEST")
tmp = cur.fetchone()
tmp

Это вернет первый элемент (последующий выбор вернет другой):

('Mike', 12)

Но следующее НЕ будет работать

testQuery = """
CREATE TABLE #TEST (
[name] varchar(256)
,[age] int )

INSERT INTO #TEST
values ('Mike', 12)
,('someone else', 904)

SELECT * FROM #TEST

"""

conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
    database=sqlDB) ## obviously setting up proper variables here...
conn.autocommit(1)
cur = conn.cursor()
cur.execute(testQuery)
tmp = cur.fetchone()
tmp

Это не произойдет, сказав "pymssql.OperationalError: No data available.". Причина, насколько я могу судить, заключается в том, что независимо от того, включен ли автокоммит или нет, и независимо от того, выполняете ли вы конкретный коммит самостоятельно или нет, все таблицы должны быть явно созданы И СОГЛАСОВАНЫ. прежде чем пытаться читать с них.

В первом случае вы заметите, что есть два "cur.execute(...)" вызова. Первый создает временную таблицу. После завершения «cur.execute()», так как автокоммит включен, скрипт SQL зафиксирован, временная таблица создана. Затем вызывается другой cur.execute() для чтения из этой таблицы. Во втором случае я пытаюсь создавать и читать из таблицы «одновременно» (по крайней мере, в уме pymssql ... он прекрасно работает в MS SQL Server Management Studio). Поскольку таблица ранее не создавалась и не фиксировалась, я не могу запросить ее.

Ого ... это было трудно обнаружить, и мне будет сложно настроить мой код (сначала разработанный на MS SQL Server Management Studio) так, чтобы он работал внутри скрипта. Ну да ладно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...