2016-04-26 35 views
1
import sqlite3, time, datetime, random, random 

class DatabaseManager(object): 
    def __init__(self, db): 
     self.conn = sqlite3.connect(db) 
     self.conn.execute('pragma foreign_keys = on') 
     self.conn.commit() 
     self.c = self.conn.cursor() 


    def query(self, arg): 
     self.c.execute(arg) 
     self.conn.commit() 
     return self.c 

    def fetch(self): 
     self.c.fetchall() 
     self.conn.commit() 
     return self.c 

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



dbmgr = DatabaseManager("connect.db") 



while 1 > 0: 

    def quantity(): 
     x = 1 
     file = open("john.txt", "r") 

     for line in file: 
      x = random.randint(100,10000000) 
      func = "INSERT INTO test (playerNAME) VALUES (?, ?)", line, x 
      dbmgr.query(func) 

你可以忽略while 1> 0,这是我删除的代码的一部分,具体问我的问题。当我调用函数quantity()(在另一部分代码中,我也删除了这个问题),我得到一个错误,指出:操作参数必须是sql中的str/python

Traceback(最近调用最后一次): 文件“C:\ Users \ senarsky.CAL \ Documents \ 2016Sem2 \ Sqlite-connect.py“,第68行,第210行,在 数量() 文件”C:\ Documents \ 2016Sem2 \ Sqlite-connect.py“数量 dbmgr.query(func) 文件“C:\ Users \ senarsky.CAL \ Documents \ 2016Sem2 \ Sqlite-connect.py”,第14行,在查询中 self.c.execute(arg) ValueError:operation参数必须是str

我不知道如何使FUNC行的字符串,而无需使用不安全的SQL格式化......

+1

'x'是一个整数。你的参数必须是str – njzk2

+1

一个简单的卫生设施可以在'query'函数中添加'args = map(str,args)' – njzk2

+0

@ njzk2我在哪里添加? – Dominico909

回答

1

括在一个元组的查询参数:

query = "INSERT INTO test (playerNAME) VALUES (?, ?)" 
parameters = (line, x) 

修改query方法来接受查询和参数:

def query(self, query, params=None): 
    self.c.execute(query, params) 
    self.conn.commit() 
    return self.c 

然后调用为:

dbmgr.query(query, parameters) 
+0

那么params = None和params变量是什么? – Dominico909

+1

@ Dominico909这是您的查询参数将被传入的位置 - “?”占位符的值。 – alecxe

+0

啊,谢谢。对于什么params =无关,我有点困惑。 – Dominico909

相关问题