通過python操作數據庫的行為,除了能夠完成前面兩講中的操作之外(當然,那是比較常用的),其實任何對數據庫進行的操作,都能夠通過python-mysqldb來實現。
## 建立數據庫
在[《用python操作數據庫(1)》](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/303.md)中,我是通過`mysql>`寫SQL語句,建立了一個名字叫做qiwsirtest的數據庫,然后用下面的方式跟這個數據庫連接
~~~
>>> import MySQLdb
>>> conn = MySQLdb.connect(host="localhost",user="root",passwd="123123",db="qiwsirtest",charset="utf8")
~~~
在上面的連接中,參數`db="qiwsirtest"`其實可以省略,如果省略,就是沒有跟任何具體的數據庫連接,只是連接了mysql。
~~~
>>> import MySQLdb
>>> conn = MySQLdb.connect("localhost","root","123123",port=3306,charset="utf8")
~~~
這種連接沒有指定具體數據庫,接下來就可以用類似`mysql>`交互模式下的方式進行操作。
~~~
>>> conn.select_db("qiwsirtest")
>>> cur = conn.cursor()
>>> cur.execute("select * from users")
7L
>>> cur.fetchall()
((1L, u'qiwsir', u'123123', u'qiwsir@gmail.com'), (2L, u'mypython', u'123456', u'python@gmail.com'), (3L, u'google', u'111222', u'g@gmail.com'), (4L, u'facebook', u'222333', u'f@face.book'), (5L, u'github', u'333444', u'git@hub.com'), (6L, u'docker', u'444555', u'doc@ker.com'), (7L, u'\u8001\u9f50', u'9988', u'qiwsir@gmail.com'))
~~~
用`conn.select_db()`選擇要操作的數據庫,然后通過指針就可以操作這個數據庫了。其它的操作跟前兩講一樣了。
如果不選數據庫,而是要新建一個數據庫,如何操作?
~~~
>>> cur = conn.cursor()
>>> cur.execute("create database newtest")
1L
~~~
建立數據庫之后,就可以選擇這個數據庫,然后在這個數據庫中建立一個數據表。
~~~
>>> cur.execute("create table newusers (id int(2) primary key auto_increment, username varchar(20), age int(2), email text)")
0L
~~~
括號里面是引號,引號里面就是創建數據表的語句,看官一定是熟悉的。這樣就在newtest這個數據庫中創建了一個名為newusers的表
~~~
>>> cur.execute("show tables")
1L
>>> cur.fetchall()
((u'newusers',),)
~~~
這是查看表的方式。當然,看官可以在`mysql>`交互模式下查看是不是存在這個表。如下:
~~~
mysql> use newtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+-------------------+
| Tables_in_newtest |
+-------------------+
| newusers |
+-------------------+
1 row in set (0.00 sec)
mysql> desc newusers;
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(2) | NO | PRI | NULL | auto_increment |
| username | varchar(20) | YES | | NULL | |
| age | int(2) | YES | | NULL | |
| email | text | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
~~~
以上就通過python-mysqldb實現了對數據庫和表的建立。
當然,能建就能刪除。看官可以自行嘗試,在這里就不贅述,原理就是在`cur.execute()`中寫SQL語句。
## 關閉一切
當進行完有關數據操作之后,最后要做的就是關閉游標(指針)和連接。用如下命令實現:
~~~
>>> cur.close()
>>> conn.close()
~~~
注意關閉順序,和打開的順序相反。
為什么要關閉?這個問題有點那個了。你把房子里面都收拾好了,如果離開房子,不關門嗎?不要以為自己生活在那個理想社會。樹欲靜而風不止,小偷在行動。更何況,如果不關閉,服務器的內容總塞著那些東西而沒有釋放,早晚就滿了。所以,必須關閉。必須的。
## 關于亂碼問題
這個問題是編寫web時常常困擾程序員的問題,亂碼的本質來自于編碼格式的設置混亂。所以,要特別提醒諸位注意。在用python-mysqldb的時候,為了放置亂碼,可以做如下統一設置:
1. Python文件設置編碼 utf-8(文件前面加上 #encoding=utf-8)
2. MySQL數據庫charset=utf8(數據庫的設置方法,可以網上搜索)
3. Python連接MySQL是加上參數 charset=utf8(在前面教程中都這么演示了,很重要)
4. 設置Python的默認編碼為 utf-8 (sys.setdefaultencoding(utf-8),這個后面會講述)
代碼示例:
~~~
#encoding=utf-8
import sys
import MySQLdb
reload(sys)
sys.setdefaultencoding('utf-8')
db=MySQLdb.connect(user='root',charset='utf8')
~~~
MySQL的配置文件設置也必須配置成utf8 設置 MySQL 的 my.cnf 文件,在 [client]/[mysqld]部分都設置默認的字符集(通常在/etc/mysql/my.cnf):
~~~
[client] default-character-set = utf8
[mysqld] default-character-set = utf8
~~~
windows操作系統請看官自己google。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python