2014-01-14 86 views
0

我是一名postgres新手,在使用Python查詢postgresql中的文本字段時遇到了一些問題。什麼是正確的語法,將允許我從表「jivemessage」中的數據庫「postgres」搜索列「body」的內容?正確的Postgresql語法

try: 
    conn = psycopg2.connect("dbname='postgres' user='postgres' host='localhost' password='<password>'") 

except: 
    print "cannot connect" 

i = 'test' 
cur = conn.cursor() 

cur.execute('SELECT * from jivemessage WHERE body LIKE "%'+i+'%"') 

不斷收到以下錯誤:

ProgrammingError: column "%test%" does not exist 

感謝您的幫助。

+0

如果你正在尋找這樣的身體,你可能想看看postgresql的全文搜索索引。 – cmd

+0

你的報價混淆了。這裏的基本是: selecttable from sometable where somefield like'%text%'; 請注意這裏的單引號。 –

回答

2

您沒有正確引用查詢。這裏不要使用字符串連接,使用SQL parameters代替:

cur.execute('SELECT * from jivemessage WHERE body LIKE %s', ("%{}%".format(i),)) 

這裏,%s佔位符信號到數據庫驅動程序,第二個參數的第一個值應查詢時,可以放在那裏。

這使插值直到數據庫驅動程序,即使您要重複使用相同的查詢,數據庫也有機會優化查詢一次

它還可以防止SQL注入攻擊比你自己更好,最重要的是,可以確保遵循正確的引用規則。

+0

不幸的是,psycopg2不使用參數作爲綁定變量。所以對SQL注入的保護並不比你更好。 – cmd

+1

@cmd:我寧願依靠圖書館來做正確的事情,想到所有的角落案例,而不是實施引用自己。太多的錯誤選項讓應用程序面臨SQL注入攻擊。 –

+0

哦,我不反對使用庫進行插值。我只是想指出,'psycopg2'實際上並沒有像我開始使用這個庫時預期的那樣綁定它們的變量。 – cmd