2017-05-27 48 views
1

我試圖創建使用這條巨蟒類的外部文件的SQLite數據庫,但我收到此錯誤信息:一類對象創建從外部文件中的SQLite數據庫

query() takes 2 positional arguments but 3 were given

我認爲我理解了這個問題,但我不知道解決這個問題的方法,有人可以指引我走向正確的方向嗎?

class DatabaseManager: 
    def __init__(self, db): 
     self.conn = sqlite3.connect(db) 
     self.conn.commit() 
     self.cur = self.conn.cursor() 

    def query(self, arg): 
     self.test_setup = open(arg) 
     self.executescript(test_setup.read()) 
     self.cur.execute(arg) 
     self.con.commit() 
     return self.cur 

    def __del__(self): 
     self.conn.close() 

dbmgr = DatabaseManager("testdb.db") 
dbmgr.query('test_setup.sql', 'r') 

回答

1

query只需要一個參數arg但你在self(隱含)和'test_setup.sql''r'通過。既然你不使用'r':你可能只能撥打:

dbmgr = DatabaseManager("testdb.db") 
dbmgr.query('test_setup.sql') 
+0

我不使用「R」?如果我排除它,我會得到更多的錯誤。 '''''''''''''''''''''''''AttributeError:'DatabaseHandler'對象沒有屬性'執行'' – cashmeer

+0

@cashmeer''r''是'open'的默認'mode',所以你不需要明確地給它 - ['execute']( https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.execute)如果你沒有在你的sql中使用任何參數,就不會使用''r''參數, – MSeifert

0

,如果你看看你的queryfor類,你會看到的聲明,你有兩個參數:自營和精氨酸

但是,當您調用查詢函數時,會傳遞三個參數:您不需要提及的隱式自我,db和參數。

如果你想要arg是一個多重參數,你將需要像這樣重寫它:* arg。否則,您可以修改三個參數的查詢聲明。

請記住,* arg是可迭代的,您可能需要在將它傳遞給其他函數之前將其解構。

進一步閱讀有關*指定參數和** kwargs,您可以訪問這個網站:*args and **kwargs in python