2011-02-08 124 views
3

在Python中使用數據庫(主要是MySQL)的標準/推薦方式是什麼?在沒有ORM的情況下在Python中使用數據庫

我不想要ORM,越輕越好。我不介意編寫自己的SELECT,但我想要映射字典的東西,例如,執行INSERT和UPDATE。我主要是一個PHP程序員,我習慣於這樣做:


$data = array(
    'foo' => 'bar' 
); 

$insert = $db->insert('table', $data); 

Python是否有這樣的東西?我研究了SQLAlchemy,這顯然是每個人都使用的,它的「SQL Expression」看起來不錯,但是使用整個事情來基本寫入原始SQL似乎過分了。

+0

首先。搜索堆棧溢出。 MySQL和Python已經提出了很多很多問題。請閱讀MySQL-Python(http://sourceforge.net/projects/mysql-python/)和Python DB API(http://www.python.org/dev/peps/pep-0249/)。閱讀資源後,請**用您的問題更新**。 – 2011-02-08 13:13:37

回答

0

據我所知,您需要爲您正在使用的數據庫系統的特定模塊。 SQLite在標準庫中。對於mySQL,請嘗試mySQLdb。有一個tutorial here

5

要使用插入一個快譯通,你正在尋找支持"named" (placeholder) paramstyle(中的鏈接,搜索「paramstyle」)一個數據庫驅動程序:

sqlite3 docs

import sqlite3 
con = sqlite3.connect("mydb")  
cur = con.cursor() 

who = "Yeltsin" 
age = 72 

cur.execute("select name_last, age from people where name_last=:who and age=:age", 
    {"who": who, "age": age}) 
print cur.fetchone() 

不幸對於MySQL,兩個主要驅動程序MySQLdboursql不支持「命名」參數類型。 MySQLdb使用「格式」參數樣式(使用'%s'),並且oursql使用「qmark」參數樣式(使用'?')。這兩種paramstyles要求您提供一個list而非dict參數的個數:

x={'bar':1.0,'baz':2.0} 
sql='INSERT INTO foo (bar,baz) VALUES (?,?)' 
cur.execute(sql,[x['bar'],x['baz']]) 

順便說一句,如果你需要一個驅動程序與MySQL連接,使用oursql。 MySQLdb歷來是Python-MySQL交互的首選驅動程序,但該驅動程序使用正則表達式將SQL和參數操縱爲一個帶引號的字符串,然後將其發送到MySQL。相反,oursql使用準備語句,分別發送SQL和參數,eschewing the need for escaping data。 oursql的方式是正確的,避免了困擾MySQLdb的certain bugs

+0

不錯,我不知道最後是否有MySQLdb的替代品。對於每個新的Python版本,它變得更加麻煩。 – 2011-02-08 15:27:05

相關問題