2013年1月10日 星期四

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

當我們連結資料庫後呼叫cursor()時便會建立一個cursor.MySQLCursor的物件,靠它可以很方便的操作資料庫。
其中最常見的就是execute()
MySQLCursor.execute(operation, params=None, multi=False)
顧名思義,這個方法是用來執行MySQL的命令,舉凡插入、查詢、刪除等都是要靠它。我們來看看它的使用方法吧:
cursor.execute("SELECT * FROM students")


這樣就是一個簡單的要求讀取students資料表內所有資料,不過執行這一行可能連一點回應都沒有,因為我們還需要呼叫fetch類的方法把資料取進python裡,這邊先暫時不提如何fetch,讓我們專注在execute上。

如同sqlite3套件,你也可以先將比較常用SQL命令打好,等到execute時再加入參數,例如:

#方式一
insert = ("INSERT INTO student (name, birthday, age) VALUES (%s, %s, %s)")
data = ('小明',datetime.date(1998, 3, 23),15)

cursor.execute(insert, data)

#方式二
select = "SELECT * FROM student WHERE age = %(age)s"
cursor.execute(select, { 'age': 15 })

如果資料量大,可以採用另一種方法executemany,例如:

data = [('小胖', date(1998, 2, 12)),
('曉華', date(1998, 5, 23)),
('小明', date(1998, 10, 3))]

insert = "INSERT INTO student (name, birthday) VALUES (%s, %s)"
cursor.executemany(insert, data)

executemany的作法是將所有資料嵌入SQL命令裡,例如範例內的程式會變成:

INSERT INTO student (name, birthday) VALUES ('小胖', 1998-2-12),('曉華', 1998-5-23),('小明', 1998-10-3)

先前不知道在裡哪看到的文章,有提到在所有SQL批量插入的方法中,將所有資料塞在同一個命令是最快的方式。不過我想SQL命令在長應該也有個限度,不過我現在找不到那篇文章了…

fetchall()、fetchone()


當我們發出查詢命令之後,要將資料取進python做使用可以使用fetch類方法,最簡單的就是先前文章提到的fetchall(),他會以list的方式回傳所有資料或者是空list(無資料)。

另一種方式是一次取出一筆:fetchone(),若沒有資料便會回傳None,事實上根據官方文件,fetchall()也是用fetchone()來實作的

cursor.execute("SELECT * FROM students")
row = cursor.fetchone()
while row is not None:
print(row)
row = cursor.fetchone()


另外有一種簡便的方式可以替代fetchone()

cursor.execute("SELECT * FROM students")
for row in cursor:
print(row)

最後要介紹的,cursor也如同sqlite套件裡的兄弟一樣提供兩個有用的屬性:

rowcount:提供上次操作所影響的筆數,此屬性僅限用於UPDATE和DELETE命令

getlastrowid:提供最後一個插入值的ID



意外的也來到第7篇了。雖然把文章寫出來,但果然都沒記到腦袋,時常翻閱。不過這樣其實也蠻方便的,哈哈。

沒有留言:

張貼留言