我正在尝试插入我的数据库,但没有任何反应,没有任何错误。
类:
class Database:
host = 'localhost'
user = 'root'
password = ''
db = 'quinielas'
def __init__(self):
self.connection = MySQLdb.connect(self.host, self.user, self.password, self.db)
self.connection.autocommit(True)
self.cursor = self.connection.cursor()
def insert(self, query):
try:
self.cursor.execute(query)
self.connection.commit() #metodo para acceptar actualizaciones
except MySQLdb.Error:
self.connection.rollback() #metodo para descartar actualizaciones
def query(self, query):
cursor = self.connection.cursor( MySQLdb.cursors.DictCursor )
cursor.execute(query)
return cursor.fetchall()
def __del__(self):
self.connection.close()
查询:
db = Database()
query = "INSERT INTO jugadores (`name`, `r1`, `r2`, `r3`, `r4`," \
" `r5`, `r6`, `r7`, `r8`, `r9`)" \
" VALUES (%s, %d, %d, %d, %d, %d, %d, %d, %d, %d)"
db.insert(query .format(name, r1, r2, r3, r4, r5, r6, r7, r8, r9))
我正在使用python 2.7和以下lib: https://pypi.python.org/pypi/MySQL-python/1.2.5#downloads
答案 0 :(得分:0)
首先,您需要在except
try/catch
中输出一条消息,以查看MySQL异常。其次,字符串插值会混淆%
运算符和.format()
方法。 %
运算符使用%s
(对于字符串)和%d
(对于数字),而.format
对任何类型的占位符使用花括号{}
。在构建连接字符串时,您需要选择任一版本。
但是在SQL中,您应该在将值传递给查询时使用,因为您应该将它们作为参数绑定。在大多数Python-MySQL API中,占位符为%s
,不应与Python的%
运算符的字符串占位符混淆。例如,其他RDMS使用?
占位符。
考虑在已定义的类 Database 中调整方法,以接收要在cursor.execute(operation, params=None, multi=False)
的第二个可选参数中使用的元组或参数列表。此外,异常消息显示正确的字符串格式:
def insert(self, query, parameters):
try:
self.cursor.execute(query, parameters)
self.connection.commit() #metodo para acceptar actualizaciones
except MySQLdb.Error as e:
print('MySQL error is: {}'.format(e))
self.connection.rollback() #metodo para descartar actualizaciones
然后,调整调用以使用不字符串格式的预准备语句传递参数列表:
db = Database()
preparedstmt = "INSERT INTO jugadores (`name`, `r1`, `r2`, `r3`, `r4`," \
" `r5`, `r6`, `r7`, `r8`, `r9`)" \
" VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"
params_tuple = (name, r1, r2, r3, r4, r5, r6, r7, r8, r9)
db.insert(preparedstmt, params_tuple)