Python連線Mysql資料庫遇到的一系列問題
本人用的是python3
,如果要連線Mysql
,你大概首先要安裝MySQL
驅動:
$ pip install mysql-connector-python --allow-external mysql-connector-python
由於MySQL
伺服器以獨立的程序執行,並通過網路對外服務,所以,需要支援Python
的MySQL
驅動來連線到MySQL
伺服器。MySQL
官方提供了mysql-connector-python
驅動,但是安裝的時候需要給pip
命令加上引數--allow-external
。
連線資料庫是一件很簡單的事情。不過我找了半天,也沒有找到Mysql
的python 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'))
推薦使用第二種方式。