2017-10-27 10 views
0

그래서 모든 제품과 해당 언어가있는 테이블이 있습니다. 제품 이름과 언어를 입력 할 때 언어 가용성을 확인하는 기능을 작성하고 싶습니다.Sqlite 다중 단어로 열 텍스트 선택

내 코드는 다음과 같다 : 내가 그것을 테스트 할 때 그래서, 모두가 하나의 단어 텍스트

checkLanguageAvailability("productname",'French')) --> True 

으로하지만 여러 단어를 텍스트로 잘 작동

"CREATE TABLE t (Language,French, Italian, German, Spanish, Japanese, Korean, 'Traditional Chinese');") 

    //insert data to table t 

def checkLanguageAvailability(self, product, language):   
     query = "SELECT " + language + " FROM t WHERE Language = '" + product + "'" 
     cur = self.df.cursor() 
     cur.execute(query) 
     # print cur.fetchall() 
     res = cur.fetchall() 
     if res[0][0] == '': 
      return False 
     elif int(float(res[0][0])) != 0: 
      return True 

checkLanguageAvailability("productname",'Traditional Chinese')) 

이 오류가 발생합니다 :

,

대신 매개 변수로 '중국 전통'전체 문자열을 복용, 그냥 '전통'이 걸릴 것으로 보인다없고 열이 테이블에이 이름이 없습니다

답변

0

사용 LIKE가 :

def checkLanguageAvailability(self, product, language):   
     query = "SELECT " + language + " FROM t WHERE Language LIKE '%" + product + "%'" 
     cur = self.df.cursor() 
     cur.execute(query) 
     # print cur.fetchall() 
     res = cur.fetchall() 
     if res[0][0] == '': 
      return False 
     elif int(float(res[0][0])) != 0: 
      return True 

그리고이 쿼리는 외부 입력을 받아들입니까? 그렇다면 준비된 진술을 사용해야합니다.

+0

당신은 적어도 준비된 문을 사용한다. –

+0

@TimBiegeleisen 매우 사실이지만 예제를 추가하기 위해 Python을 모른다. –

1

나는 테이블 구조와 코드에 동의하지 않습니다. 각 언어에 대해 새로운 열을 추가하는 것은 비용이 많이 들고 최대 유연성이 떨어집니다. 이 방법은 새로운 언어를 지원하기로 결정할 때마다 주요 스키마를 변경해야합니다. 또한 현재 병합 된 쿼리 문자열은 SQL 삽입에 취약합니다. 이 외에도 일반적으로 쿼리의 열 이름을 매개 변수로 사용하지 않아야합니다. 이 작업을 수행 할 때 잘못된 디자인이나 해킹을 나타낼 수 있습니다. 대신 다음 표를 제안합니다.

CREATE TABLE t (language TEXT, product TEXT) 

이 디자인은 주어진 제품과 언어가 단일 행으로 존재 함을 나타냅니다. 따라서 주어진 제품과 언어에 대한 레코드 항목을 찾으면 해당 항목이 있음을 알 수 있습니다. 다음과 같은 코드 뭔가를 사용하여

시도 :

def checkLanguageAvailability(self, product, language): 
    cur = self.df.cursor() 
    cmd = cur.execute("SELECT 1 FROM t WHERE product = ? AND language = ?", (product, language)) 
    res = cur.fetchall() 
    cnt = len(res) 
    if cnt == 0 
     return False 
    else 
     return True