2011-02-08 184 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

相关问题