2012-01-09 3 views
0

Это не вопрос, так как упреждающий ответ. (Я получил большую помощь с этого сайта & хотел вернуть.)pymssql (модуль python) не может использовать временные таблицы

Я боролся с большим количеством 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) 

Приведенный выше код не удается (не возвращает данных, чтобы быть конкретным, и выплевывает ошибку «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, и не мог найти какую-либо информацию о конкретной проблеме. Я также просмотрел документацию и часто задаваемые вопросы pymssql, найденные в http://code.google.com/p/pymssql/wiki/FAQ, и ничего не заметил, что временные таблицы не разрешены. Поэтому я подумал, что добавлю этот «вопрос».

ответ

2

Update: 2016 Июль

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

+1

Привет @ gord-thompson, спасибо за обновление! Я оставлю свой старый ответ, просто b/c у него есть более подробные сведения, но я теперь принял ваш в качестве официального ответа. –

1

Для тех, кто сталкивается с этим вопросом и может иметь схожие проблемы, я думал, что передаю то, что я узнал, начиная с оригинального сообщения. Оказывается, вы можете использовать временные таблицы в 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.« Причина, насколько я могу судить, заключается в том, что у вас есть автокомбинат или нет, и независимо от того, сделаете ли вы себя самостоятельно или нет, все таблицы должны быть citly должен быть создан AND COMMITTED, прежде чем пытаться прочитать их.

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

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

Смежные вопросы