2013年1月6日 星期日

[MySQL]Python連結MySQL---連結篇

前面的文章大概提到要怎麼從MySQL獲取資料,今天我們先專注在連結的部分。
import mysql.connector
c = mysql.connector.connect(user='root', password='1234',database='employees')
#資料庫處理
c.close()

一個標準的資料庫操作大概如上,先以connect()連結並取得資料庫物件,待操作後呼叫close()來關閉與資料庫的連線。

其中connect()內的參數有21種之多(文後有介紹),常用的大概就是帳號、密碼、選取資料庫、資料庫HOST、PORT這五種。但如果你需要使用大量的參數,可以參考以下的連結方式:


import mysql.connector
config = {
'user': 'root',
'password': '1234',
'host': '127.0.0.1',
'database': 'employees',
'autocommit': True,
'raise_on_warnings': True,
}
c = mysql.connector.connect(**config)
#資料庫處理
c.close()


如此可以將設定部分都移到檔頭甚至是另外的檔案方便做處理。

如果我們臨時想做切換帳號的動作呢?最直覺的想法應該是close原來的連線後再重新建立新的,不過可以不用這麼麻煩。直接呼叫config(參數如同connect())後再呼叫reconnect()重新連線即可

import mysql.connector
c = mysql.connector.connect(user='joe', database='test')
# 以'joe'帳號登入
c.config(user='jane')
c.reconnect()
# 現在改以'jane'帳號登入

如果只是想改變所選擇的資料庫比較簡單:

c.database = 'teacher'
#改為讀取teacher資料庫

print(c.database)
#此結果會顯示出目前所選取的資料庫為何

其他如帳號、連線位置等皆可以同樣方式做查詢,但無法修改(修改一定得重新連線)

如果我們想偵測是否有與MySQL做連結,可以使用is_connect(),結果會回傳True/False

mysql.connector.connect()參數詳解

有空白的就是我不懂是甚麼意思XD,基本上會用到的也就那些。另外前三個後面有括弧,那個是套件設計者佛心來的,為了讓這個套件可以相容其他同樣也是Mysql連結python設計的,所以參數名互換是可以的。
[http://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html]


參數名

預設值

說明
user(username*)資料庫帳號
password(passwd*)資料庫帳號的密碼
database(db*)想要連線的資料庫名稱
host127.0.0.1資料庫伺服器位置(預設是本機電腦)
port3306連結資料庫的port
unix_socket
use_unicodeTrue是否用unicode
charsetutf8資料庫使用編碼集
collationutf8_general_ci資料庫使用編碼
autocommitFalse是否自動交易(commit)
time_zone設定時區
sql_mode
get_warningsFalse是否獲取警告
raise_on_warningsFalse當例外發生時是否中斷
connection_timeout連線等待時間
client_flags
bufferedFalse是否cursor物件在執行查詢後立刻獲取查詢結果
rawFalse查詢結果是否使用原生資料格式,而非python資料格式
ssl_caSSL憑證授權
ssl_certSSL憑證檔案
ssl_keySSL的key

2012年12月29日 星期六

[MySQL]Python連結MySQL (包含python3.3)

        先前的文章有提到關於python使用MySQL的部分,但一年前用python3以上去連結MySQL對我這種技術新手簡直是惡夢,所幸當我從另一個噩夢(兵役)走出來的時候MySQL官方已經提供解決方案了,官方ㄋㄟ!!!相容於Python DB API,所以如果會用內建的sqlite3模組的話會更好上手,用法差不了多少。

下載位置:http://dev.mysql.com/downloads/connector/python/

如果你跟我一樣是用最潮的python3.3+64位元的話,可能得要用命令列來安裝
首先在上面的網頁的select platform選擇Platform Independent
然後下載Zip 的壓縮檔
解壓縮到你想要的地方,比如說D槽
進入命令提示字元(CMD),到剛才解壓目錄的路徑

打入安裝命令:python setup.py install

應該是不會有甚麼問題,有的話大概是忘了裝Distribute套件或是沒設系統路徑吧

裝好就先來實驗看看

import mysql.connector as sql

conn=sql.connect(host='localhost', user='root', passwd='')
c = conn.cursor()
a = c.execute("SHOW DATABASES")
for row in c.fetchall():
print(row)

其中user是MySQL帳戶,passed則是密碼,執行成功的話應該是會出現目前在MySQL內有那些資料庫。基本上以上的程式碼可以解決大部分的需求了,稍微頗析一下分別是甚麼意思。

mysql.connector.connect()

自然就是跟MySQL做連線,裡面可用的參數落落長(詳細可看這裡),但常用的大概就四個: host = 伺服器位置
user = 帳戶名
passed = 帳戶密碼
database = 選取的資料庫名


mysql.connector.cursor()

傳回資料庫游標物件(MySQLCursor()),要對資料庫下命令必須要使用這個物件,這個物件可以衍生下面兩種常用的方法

 

MySQLCursor.execute()

對資料庫下命令,範例內的"SHOW DATABASES",顧名思義就是秀出所有資料庫名字。
如果要看某table內容可以下:"SELECT * FROM xxx"


MySQLCursor.fetchall()

執行命令後還需要將資料取出來,所以執行fetchall(),意思是一次將所有資料全部取出,python會自動將資料以list的方式取出。



今天大概就介紹到這邊,以後會四個部分做詳細介紹:connect、execute、fetch、error
另外小弟經驗也沒有很老道,也懇請各位指正錯誤,讓大家可以一起學習進步,感恩

2012年12月28日 星期五

賀

        離開軍旅生活(外島前線= =)也快兩個月了,忽然想看看只有三篇的鳥巢有甚麼近況,想不到瀏覽人次比我想像的多!(我以為只有小貓兩三隻)而且還有人引用我的文章,小弟受到很大的鼓勵。所以從今天起我會努力開始產出文章的! 也希望各位先進多多給小弟意見,可以交流喜歡的事物是身為人最大的福氣!

2011年11月15日 星期二

python3資料庫解決方案

P.S.此文件會持續不斷更新


SQLite

Python3裡就有內建SQLite的讀寫模組

MySQL

很遺憾,Python3對MySQL似乎沒有比較有完整的原生套件,目前最接近目標的是oursql
2012.12.29
目前MySQL官方自己主動推出套件,強調全部都使用python撰寫,安裝不須使用C的編譯器,而且依照python DB API規範,所以會用sqlite的人應該會用得很開心,詳細介紹如下
[http://nopython.blogspot.tw/2012/12/mysqlpythonmysql-python33.html]

[oursql 0.92]
下載位置--->https://launchpad.net/oursql/py3k/
說明文件--->http://packages.python.org/oursql/

但目前這份套件卻還沒幫Python3.2做獨立安裝套件,,只有3.1的,所以要自行安裝。但由於裡面用到Cython,所以還要弄C的編譯器,要設定MySQL路徑...安裝步驟繁瑣,看到就軟掉了...

[MySQL-python-1.2.3]
下載位置--->http://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python
說明文件--->http://mysql-python.sourceforge.net/MySQLdb-1.2.2/

這個套件是python2時代最受歡迎的MySQL套件,發展超過五年,也相當的穩定,網路上文件爆多,然而最大的缺點是它開發的步伐相當緩慢(從1.2.2到1.2.3就花了三年...),因此期待它變出python3的版本可望而不可及。所幸網路上總是有熱心人士,不只改寫成Python3的版本,還幫你包成獨立安裝檔,真的是佛心來的。不過相對的,由於是非官方作品,可能會有些網路現有資料所沒有紀錄的錯誤,故要小心使用。我自己用目前簡單的試用是沒甚麼問題。

Firebird

據說這個是三大免費資料庫中(PostgreSQL、MySQL、Firebird )中速度最快、彈性最好的資料庫,且同時支援如MySQL的伺服器式或是sqlite的嵌入式應用。然而文件卻少得可憐,連官網說明文件說是亂寫也不為過。在Python2有穩定的套件,在Firebird官網裡可以找到。但Python3目前只有下面這一套:

[firebirdsql 0.63]
下載位置--->http://pypi.python.org/pypi/firebirdsql/0.6.3

這一套我有安裝成功,但使用上一直搞不懂它執行的邏輯在哪裡,是說連原資料庫的相關資料都很少...等這套件在發展一段時間會再去研究,也許會是一顆尚未雕刻的璞玉。

泛用型兵器

[pyquery] 抓網頁資料的神器

前幾年以網路有的中文資料,用python抓網頁是個很複雜的動作。使用lxml這個強大的第三方套件,對,他很強,但可能我天資駑鈍,實在太難用了。抓一個資料還得去查他在網頁裡的xpath,查出來也不一定吃(我自己試用發現吃不了<tbody>標籤組),如果有個像phpquery一樣,我只要知道我要抓的資料位置所在的id,甚至知道是第幾個甚麼標籤,那不就方便許多了嗎?
所幸過了一年後,神聽到我的請求,pyquery降臨了
首先由於該套件是以lxml作為底層剖析引擎,所以先到下列網址下載安裝
http://pypi.python.org/pypi/lxml/2.3.2
不過上面網址只有釋放原始碼,要自己打指令安裝
如果你的作業系統是Windows,有福了,這邊有一指安裝檔,在下列網頁內
http://www.lfd.uci.edu/~gohlke/pythonlibs/
找尋lxml-2.3.2,然後根據你的版本選擇安裝檔

安裝好了,接下來就是主菜了

pypi把套件下載下來http://pypi.python.org/pypi/pyquery
由於pyquery沒有製作一指安裝檔,所以不管哪種作業系統都要打指令。
將套件下載下來,解壓縮後,以命令列的方式進入套件的目錄,然後執行

python setup.py install

帶著禱告的心情按下Enter鍵,如果沒有出現安裝錯誤,水!

裝好了之後就要來測試一下
首先我們來試試看台灣yahoo
假設我們要抓取奇摩的<title></title>之間的值,該如何做呢?
請輸入以下的程式碼

from pyquery import PyQuery as pq
q = pq(url='http://tw.yahoo.com/')
print(q('title').text())

執行,你就會發現...

Yahoo!奇摩

怎麼會這麼簡單!!!

也許你會問,那可不可以用CSS的方式來抓呢?

假設我們要抓<a>標籤中屬於tag_fashion這個class的資料
把上面的程式碼中最後一行換成下面

print(q('a').filter('.tag_fashion').text())

各位有興趣自己試試看結果如何,ID值的道理也是一樣,把小數點換成#就可以了

不過又會有人問了:可是如果我要抓的資料位置沒辦法用ID方式指定,那該怎麼辦?
依然不難,該套件可以支援比如說我要抓第五個<p>標籤內的內容,方式如下

q('p').eq(4).text()

p.s. 用4的原因是因為python是以0開始記數,所以0是代表第1筆資料,4代表第5筆資料

一切就像做一塊小蛋糕一樣簡單

小弟今天就先寫到這,以後有緣會在介紹一些其他的應用。如果等不及,可以先看官方的說明文件http://packages.python.org/pyquery/index.html 。希望小弟的文章有幫到大家,再會~

2011年11月13日 星期日

字串純化成數字



相信很多人平常會遇到在抓取網頁時,資料似乎沒有那麼純,比如說2,000中間多個逗號,要是強制轉為整數,呆呆的python肯定是要跟你翻臉。

那麼我們要做的變是純化數字,方法如下:

比如說我們要把這樣的字串12dff412df54純化成1241254

''.join([x for x in '12dff412df54' if x.isdigit()])


P.S.以上資訊感謝PTT之juiz提供