1. 程式人生 > >Python連線Mysql資料庫遇到的一系列問題

Python連線Mysql資料庫遇到的一系列問題

本人用的是python3,如果要連線Mysql,你大概首先要安裝MySQL驅動:

$ pip install mysql-connector-python --allow-external mysql-connector-python

由於MySQL伺服器以獨立的程序執行,並通過網路對外服務,所以,需要支援PythonMySQL驅動來連線到MySQL伺服器。MySQL官方提供了mysql-connector-python驅動,但是安裝的時候需要給pip命令加上引數--allow-external

連線資料庫是一件很簡單的事情。不過我找了半天,也沒有找到Mysqlpython api

的介紹,不過最後還是到Mysql的官網翻到了。我直接當下來給大家一個參考:
http://download.csdn.net/detail/lishuhuakai/9310301

下面記錄一下我遇到的一些問題,以及解決方案。

1. Not all parameters were used in the SQL statement

下面看一看我的例子:

def insert_into_bk(book_list, cursor):
    """
    這個函式主要用於將表單裡面的資料存入book表單
    :param book_list:
    :return:
    """
    '''
    add_book = ("INSERT INTO books "
                "(title, author_info, pub_info, pub_time, price, rating, book_tag) "
                "VALUES (\'%s\', \'%s\', \'%s\', \'%s\', \'%s\', %f, \'%s\')")
    '''
add_book = ("INSERT INTO books " "(title, author_info, pub_info, pub_time, price, rating, book_tag) " "VALUES (%s, %s, %s, %s, %s, %f, %s)") for each_book in book_list: print(each_book) try: cursor.execute(add_book, each_book) except
mysql.connector.Error as err: print(err.msg) def add_items_into_db(book_list): # 連線到資料庫 db = mysql.connector.connect(host='169.254.138.77',user='dbuser1', password='123', database='test', port='3306') cursor = db.cursor() insert_into_bk(book_list, cursor) db.commit() db.close() if __name__ == '__main__': book_list = [('依葫蘆','sdf','sdfa','sdfa', 20, 16.1,'sdf')] # sql = add_book % ('sdf','sdf','sdfa','sdfa','sdf', 16.1,'sdf') # print(sql) add_items_into_db(book_list)

你或許壓根就找不到錯誤,怎麼可能會出錯,引數個數明明是正確的啊,怎麼會報錯說Not all parameters were used?

原因很簡單,在這裡VALUES (%s, %s, %s, %s, %s, %f, %s),將f改為s–>VALUES (%s, %s, %s, %s, %s, %s, %s),立馬好了。
下面是老外的一段解釋。

Note that the parameter markers used by mysql.connector may look the same as the %s used in Python string formatting but the relationship is only coincidental. Some database adapters like oursql and sqlite3 use ? as the parameter marker instead of %s.

2.Incorrect string value

這個問題在於字符集問題,我的建議是在建表的時候就設定表的字符集,如我下面的表單。

def create_bk_tb(db, cursor):
    """
    用來建立book表單
    :param db:
    :return:
    """
    tb = {}
    tb['books'] = (
    "CREATE TABLE `books` ("
    "  `title` varchar(50) NOT NULL,"
    "  `author_info` varchar(150),"
    "  `pub_info` varchar(50),"
    "  `pub_time` varchar(16),"
    "  `price` varchar(20),"
    "  `rating` float,"
    "  `book_tag` varchar(50),"
    "  PRIMARY KEY (`title`)"
    ") ENGINE=InnoDB CHARSET=utf8")


    try:
        print("正在建立book表...")
        cursor.execute(tb['books'])
    except mysql.connector.Error as err:
        if err.errno == errorcode.ER_TABLE_EXISTS_ERROR:
            print("already exists.")
        else:
            print(err.msg)
    print("OK")

在建表的同時設定了字符集為utf-8,這樣最方便,其餘的解決方案請看其他人的部落格。

3. python如何向mysql插入特殊字元

如果自己來處理的話,很困難,因為你無法判斷一個欄位中是否有應該轉義的字元。

insert into table book(title, author, pub) values ('green'body', 'li', 'china');

上面的語句是會出錯的,因為green'body的單引號沒有轉義,自己如果手工去轉義的話會非常麻煩,還好,Mysql考慮到了這一點。

cursor.execute()可以接受一個引數,也可以接受兩個引數:
第一種方式是直接給一個sql語句:

 sql = 'insert into table book(title, author, pub) values (\'green\'body\', \'li\', \'china\');' # 記得要轉義
 cursor.execute(sql) # 很麻煩對吧

第二種方式就很優雅啦,讓execute來替我們轉義:

sql = 'insert into table book(title, author, pub) values (%s, %s, %s)';
cursor.execute(sql, ('green\'body', 'li', 'china'))

推薦使用第二種方式。