2011-06-16 62 views
4

在我的服務器代碼中,有一個調用_SO_fetchAlternateID(嵌套在一些value調用中),最終調用makeConnectionpgconnection.pypython:爲什麼SQLObject在conn.autocommit(1)中失敗?

該呼叫conn.autocommit(1)失敗,並錯誤

TypeError: 'bool' object is not callable

這裏的SQLObject的(0.8.7)代碼:

def makeConnection(self): 
try: 
    if self.use_dsn: 
     conn = self.module.connect(self.dsn) 
    else: 
     conn = self.module.connect(**self.dsn_dict) 
except self.module.OperationalError, e: 
    raise self.module.OperationalError("%s; used connection string %r" % (e, self.dsn)) 
if self.autoCommit: 
    # psycopg2 does not have an autocommit method. 
    if hasattr(conn, 'autocommit'): 
     conn.autocommit(1) 
return conn 

調試表明,康恩確實擁有一個連接對象,但自動提交不是一種方法,而是一種布爾(假)。

self.module是模塊'psycopg2'(2.4.2)。

這是配置問題嗎?不匹配的版本?

UPDATE:

病因原來是在psycopg2-2.4.2不兼容的問題。查看C源代碼,psycopg/connection.h有一個不幸名爲autocommit的整型變量。版本2-2.4正常。

回答

4

您剛剛發現了一個錯誤。看看下面的代碼:

def _setAutoCommit(self, conn, auto): 
    # psycopg2 does not have an autocommit method. 
    if hasattr(conn, 'autocommit'): 
     conn.autocommit(auto) 

它假定conn(類型:psycopg2.connection)可能沒有autocommit屬性,但是當它有一個,它必須是一個函數。這在psycopg2.connection的情況下是錯誤的,其中psycopg2.connection.autocommit is a bool

正如你所提到的,在makeConnection中也採用了相同的假設,並且在那裏沒有其他功能。

這可以通過更改每個電話如conn.autocommit(val)conn.autocommit = val來解決,這應該很容易,即使使用sed也是如此。

+0

我看到了這段代碼。但我也調試了其他運行相同版本的SQLObject和psycopg2的其他計算機的代碼,其中'hasattr(conn,'autocommit')'爲False。 – Ovesh 2011-06-21 07:33:36

+0

@Ovesh這很奇怪。'autocommit'(就像整個'connection'一樣)來自這個模塊的C源代碼,在這個源代碼中它被聲明爲'int'(對於Python,它是'bool',因爲C沒有任何明確的布爾類型)在'psycopg/connection.h'中。沒有辦法,它不會存在或是一個函數(如果你真的使用相同的代碼 - 也許一些導入失敗或'conn'是'None'?)。 – 2011-06-21 20:28:51

+0

我非常肯定它的行爲方式我說它在其他機器上。但是,它們的版本略有不同:2-2.4而不是2-2.4.2。我沒有辦法在他們的機器上查看C源代碼,因爲它已經被編譯成了這樣的文件。 – Ovesh 2011-06-22 06:08:27

1

聽起來好像某人在代碼中有人給conn對象分配了autocommit = True

當翻譯到達:

conn.autocommit(1) 

事實上,它的計算結果:

True(1) 

檢查self.dsn或self.dsn_dict的內容,如果沒有一個 '自動提交' 布爾鍵。

+0

我查看了SQLObject文件。 「dsn」和「dsn_dict」只出現在postgres/pgconnection.py(這是有道理的),但autocommit沒有設置在任何地方。我相當確信這是SQLObject和psycopg2版本之間的不兼容問題。 – Ovesh 2011-06-20 07:52:11

相關問題