2014-01-25 46 views
0

我們根據GNU Health。我們開發的tryton模塊得到了以下錯誤:「操作符不存在字符改變= BIGINT」在GnuHealth項目

ProgrammingError: operator does not exist character varying = bigint 
Hint: No opreator matches the given name and argument type(s). You might need to add explicit type casts 
+0

你做了什麼來產生這個錯誤?你是如何得到這一點的?你已經試過/讀過什麼?產生該錯誤的SQL查詢是什麼,它來自哪裏? (如果您不知道查詢是什麼,請在'postgresql.conf'中啓用'log_statement = all'並重新加載postgresql)。 –

+0

我們開發了帶有PMRN和OP No.的新患者註冊模塊。這些是患者識別代碼。在老病人登記時,我們希望在提供PMRN時檢索日期,否則它將顯示該特定病人記錄的詳細信息。 PMRN的前例否是201401270001,但數據類型是Char。在Python編碼查詢是((選擇名稱,年齡,dob,地址從TABLENAME在哪裏pmrn =%s)%(self.pmrn)) –

+0

Urk,請*編輯問題*添加任何後續然後評論讓讀者知道你已經做了一個編輯。評論中的SQL幾乎是不可讀的。 –

回答

4

是最好的,我可以隱約猜測從有限的信息提供,在此查詢:

"SELECT name,age,dob,address FROM TABLENAME WHERE pmrn=%s" % (self.pmrn) 

你似乎是做一個值的字符串替換成一個查詢。

首先,this is dangerously wrong,你永遠不應該沒有極其好理由。 總是use parameterized queriespsycopg2支持這些,所以沒有理由不這樣做。因此,爲PostgreSQL做所有其他Python接口,但我假設你使用psycopg2,因爲基本上每個人都這樣做,所以請閱讀the usage documentation以瞭解如何傳遞查詢參數。

其次,由於未能使用參數化查詢,您沒有從具有數據類型處理的數據庫驅動程序獲得任何幫助。你提到pmrnchar的類型 - 爲此我假設你的意思是varchar;如果它實際上是char那麼數據庫設計師需要被擱置一旁進行公司談話。無論如何,如果你在那裏,你的查詢替換帶引號的數字是要看起來像:

pmrn = 201401270001 

如果pmrnvarchar那將是一個錯誤,因爲你無法直接將文本類型比較了一些。您必須將該值作爲文本傳遞。在簡單的方法就是把它周圍的報價:

pmrn = '201401270001' 

,但你應該做的,而不是通過使用參數化查詢psycopg2照顧這一切爲您服務。例如。

curs.execute("SELECT name,age,dob,address FROM TABLENAME WHERE pmrn=%s", (self.pmrn,)) 

即將SQL查詢作爲字符串傳遞,然後傳遞包含查詢參數的1元組。 (如果它也是int,則可能必須將self.pmrn轉換爲str,例如str(self.pmrn))。

+0

我按照你的說法做了一些修改,但是我得到了這樣一個錯誤,這個錯誤就是 cur。執行(「select title,name,lastname,dob from outpatient_new_registration where pmrn =%s」,(self.pmrn)) 文件「/trytond/backend/postgresql/database.py」,行306,執行 res = self .cursor.execute(sql,params) TypeError:並非在字符串格式化期間轉換的所有參數 –

+0

@BalamuruganS一個python 1元組是'(self.prmn,)'。不只是'(self.prmn)'。如果你寫'(self.prmn)',Python將忽略多餘的圓括號,Psycopg2將嘗試讀取序列self.prmn的元素,如果它是一個字符串,則是字符串中的每個字符。如果有多個字符,'psycopg2'會抱怨它有參數,但沒有佔位符可以放入。 –

+0

感謝它的運作 –

相關問題