无法使用python插入mysql数据库

时间:2017-02-25 00:23:09

标签: python mysql python-2.7

我正在尝试插入我的数据库,但没有任何反应,没有任何错误。

类:

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

1 个答案:

答案 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)