在Python中不使用ORM操作数据库

5 投票
2 回答
3223 浏览
提问于 2025-04-16 11:26

在Python中,处理数据库(主要是MySQL)有什么标准或推荐的方法吗?

我不想使用ORM(对象关系映射),越简单越好。我不介意自己写SELECT语句,但我希望有一些工具可以把字典映射到INSERT和UPDATE操作上。我主要是个PHP程序员,习惯于这样做:


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

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

Python中有没有类似的东西?我看过SQLAlchemy,似乎大家都在用,它的“SQL表达式”看起来不错,但感觉用整个框架来写简单的原始SQL有点过于复杂了。

2 个回答

0

据我所知,你需要一个特定的模块来连接你正在使用的数据库系统。SQLite 是 Python 自带的库,直接可以用。而如果你想用 mySQL,可以试试 mySQLdb。这里还有一个 教程,可以帮你了解怎么使用。

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来说,两个主要的驱动程序,MySQLdboursql都不支持“命名”参数样式。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的一些常见错误

撰写回答