在Python中不使用ORM操作数据库
在Python中,处理数据库(主要是MySQL)有什么标准或推荐的方法吗?
我不想使用ORM(对象关系映射),越简单越好。我不介意自己写SELECT语句,但我希望有一些工具可以把字典映射到INSERT和UPDATE操作上。我主要是个PHP程序员,习惯于这样做:
$data = array(
'foo' => 'bar'
);
$insert = $db->insert('table', $data);
Python中有没有类似的东西?我看过SQLAlchemy,似乎大家都在用,它的“SQL表达式”看起来不错,但感觉用整个框架来写简单的原始SQL有点过于复杂了。
2 个回答
5
如果你想用字典来插入数据,你需要找一个支持“命名”(占位符)参数样式的数据库驱动程序(在链接中搜索“paramstyle”)。
根据sqlite3的文档:
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来说,两个主要的驱动程序,MySQLdb和oursql都不支持“命名”参数样式。MySQLdb使用的是“格式”参数样式(用'%s'),而oursql使用的是“问号”参数样式(用'?')。这两种参数样式都要求你提供一个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和参数,避免了数据转义的需要。oursql的方式是正确的,能够避免MySQLdb的一些常见错误。