2011-03-05 7 views
5

이 코드 :sqlite3.OperationalError 구문 오류

conn = connect('emails.db') 
curs = conn.cursor() 

curs.execute('''create table items 
    (integer primary key, X, Y)''') 

curs.execute("INSERT INTO items (integer primary key, X, Y) VALUES ('today', 'X', 'Y')") 

connection.commit() 

반환 :

sqlite3.OperationalError: near "primary": syntax error

는 어떻게? 나는 내가 뭘 잘못하고 있는지 보지 못한다. 거기에 넣는 값은 모두 변수 btw입니다.

+1

SQLite "철도"구문 다이어그램은 매우 유용합니다. http://www.sqlite.org/lang_createtable.html ... 최상위 수준은 다음과 같습니다. http://www.sqlite.org/lang.html –

답변

9

CREATE TABLE이 올바르지 않습니다. 첫 번째 ('정수 기본 키') 열의 이름을 지정하지 않습니다. SQLite는 필드가integer이라고 생각하고 데이터 유형을 정의하지 않았습니다. 매우 효율적이므로 INTEGER PRIMARY KEY 필드가 필요합니다. 이렇게하려면 CREATE TABLE syntax을 존중하고 이름 부여하려면 보조 노트로

CREATE TABLE items 
(id INTEGER PRIMARY KEY 
, x DOUBLE 
, y DOUBLE 
); 

을 : 유형을 지정하는 것은 단지 좋은 방법이며, 또한 약간 더 때문에 나는 루타로 X와 Y를 정의한 실력 있는. 물론 텍스트를 텍스트에 넣으려면 TEXT로 정의하십시오. 또는 정수가 주로 포함되도록하려면 INTEGER로 정의하십시오. 실제로 어떤 데이터를 넣을 지 모르는 경우에만 데이터 유형을 생략하십시오.

다음으로 INSERT statement은 필드 이름만을 요구하므로 (전체 정의가 아님) SQLite는 구문 오류를 발생시킵니다.

마지막으로 '오늘'(텍스트 값)을 정수 열에 넣는 것이 바보 같지 않습니까?


편집 : 나는 왼쪽했습니다

curs.execute("INSERT INTO items (X, Y) VALUES (:X, :Y)", {X: X, Y: Y}) 

: 당신은 X와 Y 변수 말할 때문에,뿐만 아니라 SQL 문에 그 변수를 바인딩에 바른 길에 당신을 둘 수 밖으로 id 기본 키 필드, 이후 SQLite가 자동으로 생성되므로 그것은 존재하지 않습니다. 명시 적 값을 전달하려는 경우 할 수 있습니다. 그러나 그것이 정수이고 그것이 유일하다는 것을주의하십시오! SQL 문에

:X:Y 매개 변수는 execute 문에 두 번째 매개 변수로 전달되는 사전의 XY 멤버를 참조하십시오.

바인딩 매개 변수는 SQL 문자열 자체에 매개 변수를 포함하는 것보다 both safer and faster입니다.

+0

Do : X 및 : Y는 sqlite3 python 드라이버에서 작동합니까? 문서화 된 유일한 대체 매개 변수는 '?'입니다. – SilverbackNet

+1

@ SilverbackNet : 그들은 [또한이 코멘트에 따라] (http://stackoverflow.com/a/1010804/60590) – Martijn

+0

고마워! 그것은 내가 SQLite를 사용하기 시작했을 때 내가 잃어버린 것이라고 생각한 약간의 유연성을 추가합니다. – SilverbackNet

관련 문제