2012-05-08 6 views
0

저는 파이썬에서 초보자입니다. 나는 액세스 데이터베이스에 대한 질의를하고있다. SQL 문에 문자열 변수를 전달했지만 두 배로 계산할 수는 없습니다. 여기 파이썬에서 SQL 문에 변수를 전달하는 방법은 무엇입니까?

내 코드입니다 :

qllname = 29221.0 

llname = "01-01-05-W2" 

sqlstatement = recordset.Open("SELECT * FROM LLD WHERE LLD = '%s'" % (llname),connection,1,3) 

for x in range(recordset.Fields.Count): 

    fields_dict[x] = recordset.Fields.Item(x).Name 

    print fields_dict[x], recordset.Fields.Item(x).Value, x 


sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3) 

for x2 in range(recordset2.Fields.Count): 

    print recordset2.Fields.Item(x2).Value, type(recordset2.Fields.Item(x2).Value) 

결과 :

LLD 01-01-05-W2 0 
X 678817.81875 1 
Y 5431052.45982 2 
Traceback (most recent call last): 
    File "L:/temporary/start of test/accessnew--.py", line 25, in <module> 
    sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3) 
    File "<COMObject ADODB.Recordset>", line 4, in Open 
com_error: (-2147352567, 'Exception occurred.', (0, u'Microsoft JET Database Engine', u'Data type mismatch in criteria expression.', None, 5003071, -2147217913), None) 
>>> 
+1

파이썬의 DBAPI 사양과 실제로 호환되는 데이터베이스 API를 사용해야합니다. – ThiefMaster

답변

3

시도 :

sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS WHERE WWDR_NO = '%d'" % (qllname),connection2,1,3) 

당신이있어 나에게 알려주는 %d 문자열 보간 연산자를 사용하고 숫자를 SQL 문에 전달합니다. 그러나 정수가 필요할 때 SQL 문자열을 사용합니다. WWDR_NO는 정수 경우 "데이터 얻을 것보다,

SELECT * FROM SWAWELLS WHERE WWDR_NO = '29221' 

:

SELECT * FROM SWAWELLS WHERE WWDR_NO = 29221 

그러나, 귀하가 제공 한 코드가이 문을 생성합니다 - 난 당신과 같은 SQL 문을 원한다고 생각 유형 표현 불일치가 일치하지 않습니다. 다른 사람이 당신이 DBAPI 래퍼를 사용해야 언급 한 바와 같이, 또한

# Notice there is no ' around %d 
sqlstatement2 = recordset2.Open("SELECT * FROM SWAWELLS " 
           "WHERE WWDR_NO = %d" % 
           (qllname),connection2,1,3) 

:

이보십시오. 그게 뭐야? DB-API는 데이터베이스 액세스를위한 파이썬 "표준"입니다. ACCESS에는 adodbapi이라는 이름이 있습니다. 나는이 도서관의 상태에 대해 모른다. 사람들이 당신이 위에있는 보간법에서 벗어나 있다고 말하는 이유는 잘못된 SQL을 만들 수 있기 때문이며 신뢰할 수없는 소스에서 데이터를 가져 오는 것이 보안 상 위험 할 수 있기 때문입니다.

기타 을 사용하는 이점은 BIG입니다. 그리고 코드를 소용돌이 치게 만들면 코드가 다른 데이터베이스에 이식 될 수 있습니다.

지금 라이브러리를 다운로드하지 않고 DBAPI를 확인하고 싶습니까? py2.5 이상을 사용하는 경우 sqlite로 빌드해야합니다. sqlite3 모듈 here을 확인하십시오.

2

% 형식 지정 연산자를 사용하지 마십시오. 이것은 안전하지 않습니다. 여기

파이썬 데이터베이스 API 사양 2.0 http://www.python.org/dev/peps/pep-0249/

파이썬 DB 래퍼의 대부분을 지원합니다.

+0

맞습니다. 일반적으로 그렇게해서는 안됩니다. 그러나 당신이 @ 코드를 보면 Microsoft ADO와 매우 흡사합니다. 나는 틀릴 수도 있고, 나는 오랫동안 그렇게 속지 않았다. 이 경우 API는 SQL 문 준비 방법을 제공한다고 생각합니다. – jaime

관련 문제