Python系列四--對MySQL操作,問題匯總

前言:本次實驗基于Python3.5丈屹,很多問題都是可以用debug調(diào)試出來的

Python 操作MySQL流程

Python 操作MySQL流程.png

1调俘、運行結(jié)果中文顯示亂碼

中文顯示亂碼.png

具體方法如下:

1)MySQL數(shù)據(jù)庫charset=utf-8
Paste_Image.png
2)Python文件設(shè)置編碼 utf-8 ,在文件前面加上一下代碼
 # -*- coding: utf-8 -*-
3)Python連接MySQL時加上參數(shù) charset=utf8
conn = pymysql.connect(host='localhost', port=3306, user='root',
                       passwd='123456', db='zyptest', charset='utf8')
4)設(shè)置Python的默認(rèn)編碼為 utf-8 (sys.setdefaultencoding(utf-8)

設(shè)置路徑:Pycharm軟件旺垒,F(xiàn)ile--Settings--File and Code Templates--Python Script

設(shè)置編碼格式路徑.png

若想要結(jié)果以字典的方式輸出彩库,有2種方式(此方法不適用python3.6),代碼如下

  • 在 connection 的地方加上 cursorclass = pymysql.cursors.DictCursor
conn = pymysql.connect(host='localhost', port=3306, user='root',
                       passwd='123456Aa', db='zyptest', charset='utf8',
                       cursorclass = pymysql.cursors.DictCursor)
  • 創(chuàng)建游標(biāo)時指定
conn = pymysql.connect(host='localhost', port=3306, user='root',
                       passwd='123456Aa', db='zyptest', charset='utf8')
cur = conn.cursor(cursorclass=pymysql.cursors.DictCursor)  


2先蒋、使用IP地址連接mysql數(shù)據(jù)庫服務(wù)時提示“1130-host 'LAPTOP OOR4C 1HG' is not allowed to connect to this MySql server”

(pymql.connection 使用 host 使用 localhost 表達(dá)時調(diào)試沒有問題)

使用IT地址報錯.png

解決辦法
(1)改表法侧巨。
可能是你的帳號不允許從遠(yuǎn)程登陸,只能在localhost

mysql> use mysql;
mysql> select host,user from user;   
mysql> update user set host='%' where user='root' and host='localhost';

提醒:如果方法一解決不了你的問題鞭达,那還是先把user表中的host字段值改回去,再試試方法二

(2)授權(quán)法
Sql代碼(此處需要根據(jù)實際情況修改用戶(root)和密碼(123456)信息)

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;      //授權(quán)
mysql>flush privileges;      //刷新權(quán)限皇忿,不需要重啟


3畴蹭、使用云服務(wù)器的IP地址連接mysql數(shù)據(jù)庫服務(wù)時提示“ConnectionRefusedError: [WinError 10061] 由于目標(biāo)計算機(jī)積極拒絕,無法連接鳍烁∵督螅”

使用云服務(wù)器的IP地址連接報錯.png

原因分析:安裝mariadb時禁止了遠(yuǎn)程登錄

解決辦法:重新設(shè)置,允許遠(yuǎn)程登錄(詳情見之前安裝的文章)

1幔荒、找到mysql的配置文件my.cnf糊闽,使用命令 find / -name "*my.cnf"
2、在my.cnf文件的 [mysqld] 后加入skip-grant-tables爹梁,保存文件
3右犹、重啟mysql服務(wù) service mysql restart
4、重新登錄mysql (直接輸入mysql姚垃,不需要密碼)
5念链、修改密碼

use mysql;
update user set password=PASSWORD("密碼") where user='root';”(修改root的密碼)

6、再把配置文件的my.cnf 加入的skip-grant-tables刪除保存,或者 前面加上 #
7掂墓、重啟mysql服務(wù) (mysqld -restart)
8谦纱、重新登錄(使用密碼登錄,mysql -uroot -p)


4君编、運行正常跨嘉,但沒有結(jié)果輸出

OperationDbInterface 被封裝成了類,此時叫做方法吃嘿,想要調(diào)用的話需要實例化類祠乃。
(不封裝叫函數(shù))

if _name_ == "_main" (此處是2個下劃線)
在句子開始處加上if,就說明唠椭,這個句子是一個條件語句
_name_:作為模塊的內(nèi)置屬性,就是.py文件的調(diào)用方式
_main_:.py文件有兩種使用方式:作為模塊被調(diào)用和直接使用寺庄。如果它等于 "_main_" 就表示是直接執(zhí)行
在 if _name
== "_main_" :之后的語句作為模塊被調(diào)用的時候斗塘,語句之后的代碼不執(zhí)行;直接使用的時候亮靴,語句之后的代碼執(zhí)行茧吊。通常搓侄,此語句用于模塊測試中使用讶踪。

貼上源代碼

import pymysql
import os
import logging


class OperationDbInterface(object):     # 聲明類
    def __init__(self):
        self.conn = pymysql.connect(host='localhost', port=3306, user='root',
                                    passwd='123456', db='mysql', charset='utf8')
        self.cur = self.conn.curror()   # 創(chuàng)建游標(biāo)

    # 定義單條數(shù)據(jù)操作乳讥,增刪改
    def op_sql(self, param):
        try:
            self.cur.execute(param)  # 執(zhí)行sql語句
            self.conn.commit()
            return True
        except pymysql.Error as e:
            print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
            logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
                                level=logging.DEBUG,
                                format='%(asctime)s %(filename)s[line:%(lineno)d] %     (levelname)s %(message)s')
            logger = logging.getLogger(__name__)
            logger.exception(e)
            return False

    # 查詢表中單條數(shù)據(jù)
    def selectone(self, condition):
        try:
            self.cur.execute(condition)
            results = self.cur.fetchone()   # 獲取一條數(shù)據(jù)
        except pymysql.Error as e:
            results = 'sql0001'  # 數(shù)據(jù)庫執(zhí)行錯誤
            print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
            logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
                                level=logging.DEBUG,
                                format='%(asctime)s %(filename)s[line:%(lineno)d] % (levelname)s %(message)s')
            logger = logging.getLogger(__name__)
        logger.exception(e)
        finally:
            return results

    # 查詢表中多條數(shù)據(jù)
    def selectall(self, conditon):
        try:
            self.cur.execute(conditon)
            self.cur.scroll(0, mode='absolute')     # 光標(biāo)回到初始位置
            results = self.cur.fetchall()    # 返回游標(biāo)中所有結(jié)果
        except pymysql.Error as e:
            results = 'sql0001'  # 數(shù)據(jù)庫執(zhí)行錯誤
            print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
            logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
                                level=logging.DEBUG,
                                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
            logger = logging.getLogger(__name__)
            logger.exception(e)
        finally:
            return results

    # 定義表中插入多條數(shù)據(jù)操作
    def insertmore(self, condition):
        try:
            self.cur.executemany(condition)
            self.conn.commit()
            return True
        except pymysql.Error as e:
            results = 'sql0001'  # 數(shù)據(jù)庫執(zhí)行錯誤
            print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
            logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
                                level=logging.DEBUG,
                                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
            logger = logging.getLogger(__name__)
            logger.exception(e)
            return False

    # 判斷表是否存在
    def __del__(self):
        if self.cur is not None:
            self.cur.close()
        if self.conn is not None:
            self.conn.close()

if __name__ == '__main()__':
    test = OperationDbInterface()  # 實例化類
    result = test.selectone('select * from db')
    print(result)
運行無結(jié)果輸出.png

原因分析:main()多了括號汹忠,應(yīng)該是

if __name__ == '__main__':

改完之后運行報錯 “AttributeError: 'Connection' object has no attribute 'curror'”
根據(jù)錯誤提醒回到20行代碼檢查,發(fā)現(xiàn)是 cursor 拼錯了

Paste_Image.png

接著改好執(zhí)行發(fā)現(xiàn)結(jié)果出來了橄唬,但是仍有報錯信息(Python3.5正常沒有報錯仰楚,如下圖是3.6的報錯信息

備注:待解決

有結(jié)果輸出但仍報錯.png

5、執(zhí)行錯誤語句臭挽,生成日志文件欢峰,打開沒有內(nèi)容

cd9b03664b5d458d629cc33e5b618ff.png

檢查發(fā)現(xiàn) logging 用的是2.7的語法格式宠漩,用2.7調(diào)試報錯

723881941772656882.png

6扒吁、執(zhí)行插入語句時報錯

TypeError: insertmore() takes 2 positional arguments but 3 were given

執(zhí)行插入語句時報錯.png

原因分析:
executemany()方法是要傳兩個參數(shù),一個sql語句一個args(list)盼铁,源碼中只有一個參數(shù)
解決辦法:函數(shù)中增加參數(shù) params

executemany()方法.png

7、執(zhí)行批量刪除語句時報錯

def deletemore(self, condition, params):
    try:
        self.cur.executemany(condition, params)   # executemany為批量操作冬念,可以進(jìn)行多行插入
        self.conn.commit()
        return True

if __name__ == "__main__":
    test = OperationDbInterface()  # 實例化類
result = test.deletemore("delete from student WHERE id in(6,7)")
print(result)
執(zhí)行批量刪除語句時報錯.png

原因分析:不管字段是str,還是int裆针,或者其他類型世吨,都需要使用 %s 傳遞參數(shù)的方式進(jìn)行耘婚,正確如下

result = test.deletemore("delete from student WHERE id in(%s)",[6,7])
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚷闭,一起剝皮案震驚了整個濱河市胞锰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌色乾,老刑警劉巖案怯,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麦锯,居然都是意外死亡扶欣,警方通過查閱死者的電腦和手機(jī)料祠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澎羞,“玉大人髓绽,你說我怎么就攤上這事妆绞》闩剩” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我笤闯,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上漠畜,老公的妹妹穿的比我還像新娘币他。我一直安慰自己,他們只是感情好憔狞,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布瘾敢。 她就那樣靜靜地躺著,像睡著了一般簇抵。 火紅的嫁衣襯著肌膚如雪庆杜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天正压,我揣著相機(jī)與錄音欣福,去河邊找鬼责球。 笑死焦履,一個胖子當(dāng)著我的面吹牛拓劝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘉裤,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼郑临,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了屑宠?” 一聲冷哼從身側(cè)響起厢洞,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎典奉,沒想到半個月后躺翻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡卫玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年公你,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片假瞬。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡陕靠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脱茉,到底是詐尸還是另有隱情剪芥,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布琴许,位于F島的核電站税肪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏虚吟。R本人自食惡果不足惜寸认,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望串慰。 院中可真熱鬧偏塞,春花似錦、人聲如沸邦鲫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庆捺。三九已至古今,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間滔以,已是汗流浹背捉腥。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留你画,地道東北人抵碟。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓桃漾,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拟逮。 傳聞我的和親對象是個殘疾皇子撬统,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 【MySQL】Linux下MySQL 5.5罚屋、5.6和5.7的RPM苦囱、二進(jìn)制和源碼安裝 1.1BLOG文檔結(jié)構(gòu)圖 ...
    小麥苗DB寶閱讀 10,544評論 0 31
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法脾猛,內(nèi)部類的語法沿彭,繼承相關(guān)的語法,異常的語法尖滚,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 1.MySQL是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng)喉刘,由瑞典MySQL AB 公司開發(fā),目前屬于 Oracle 旗下產(chǎn)品漆弄。My...
    黃花菜已涼閱讀 4,570評論 3 60
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理睦裳,服務(wù)發(fā)現(xiàn),斷路器撼唾,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • 后來這首歌廉邑,聽過很多次,卻從來沒有理解歌詞所說的那種意境倒谷,直到我上了大學(xué)蛛蒙,離開家鄉(xiāng)離開我生命中重要的人 ,才明白了...
    傾城_75a7閱讀 278評論 0 0