2015-09-07 103 views
0

我已經嘗試了幾個驅動程序:pymsql,pyobdc,並且在SQL中仍然有格式單引號的問題。下面的代碼實例:Python - SQL語句中的單引號PyODBC

CASE 1

import pyodbc 

UPDATE_SQL3 = """ 
    UPDATE STATION 
    SET 
     STATION_NAME = ?, 
     STATION_TITLE = ?, 
     ACTIVE = ? 
    WHERE 
     STATION_ID = ? 
""" 

conn = pyodbc.connect('DRIVER={SQL Server};SERVER=local;DATABASE=DB;UID=me;PWD=pass') 
cursor = conn.cursor() 

cursor.execute(UPDATE_SQL3 % 
          (name, 
          title, 
          active, 
          id 
          )) 

此代碼不編譯:

"not all arguments converted during string formatting"

CASE 2.

UPDATE_SQL3 = """ 
    UPDATE STATION 
    SET 
     STATION_NAME = %s, 
     STATION_TITLE = %s, 
     ACTIVE = %s 
    WHERE 
     STATION_ID = %s 
""" 

我趕錯誤:

('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'The'. (102) (SQLExecDirectW)")

一次title = u'102.7 The Fan'

CASE 3.

UPDATE_SQL3 = """ 
    UPDATE STATION 
    SET 
     STATION_NAME = '%s', 
     STATION_TITLE = '%s', 
     ACTIVE = %s 
    WHERE 
     STATION_ID = %s 
""" 

錯誤:

('42000', "[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 's'. (102) (SQLExecDirectW)")

其中name = u'Power Michiana\\'s Hits and Hip Hop'

什麼是處理它的正確方法?

+0

的情況下,3名做= u'Power Michiana \的點擊和嘻哈' – akalikin

+0

我如何正確地做到這一點?我試圖替換字符--' title = title.replace(「\\」,「」)',但我仍然看到 - 'title = u'Power Michiana \''Hits and Hip Hop'' – SpanishBoy

回答

2

您的「CASE 1」基本上是正確的,但您沒有正確地將參數傳遞給conn.execute。而不是試圖用字符串格式化(通過%運營商),只需將元組的第二個參數傳遞給.execute,就像這樣:

import pyodbc 

# test data 
name = u"Power Michiana's Hits and Hip Hop" 
title = u"(some title)" 
active = False 
id = 1 

conn_str = "DSN=myDb_SQLEXPRESS" 
conn = pyodbc.connect(conn_str) 
cursor = conn.cursor() 
UPDATE_SQL3 = """\ 
UPDATE STATION 
SET 
    STATION_NAME = ?, 
    STATION_TITLE = ?, 
    ACTIVE = ? 
WHERE 
    STATION_ID = ? 
""" 
cursor.execute(UPDATE_SQL3, (name, title, active, id)) 
conn.commit() 
conn.close() 
print("Done.")