【问题标题】:Working with databases in Python without an ORM在没有 ORM 的情况下使用 Python 中的数据库
【发布时间】:2011-06-23 10:21:58
【问题描述】:

在 Python 中使用数据库(主要是 MySQL)的标准/推荐方式是什么?

我不想要 ORM,而且越轻越好。我不介意编写自己的 SELECT,但我想要一些映射字典的东西,例如,执行 INSERT 和 UPDATE。我主要是一名 PHP 程序员,我习惯做这样的事情:


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

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

Python 有这样的东西吗?我研究了显然每个人都在使用的 SQLAlchemy,它的“SQL 表达式”看起来不错,但使用整个东西基本上编写原始 SQL 似乎有点过头了。

【问题讨论】:

标签: python database


【解决方案1】:

据我所知,您正在使用的数据库系统需要一个特定的模块。 SQLite 在标准库中。对于 mySQL,请尝试 mySQLdb。有一个tutorial here

【讨论】:

    【解决方案2】:

    要使用 dict 进行插入,您正在寻找支持 "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 使用“format” paramstyle(使用'%s'),而oursql 使用“qmark” paramstyle(使用'?')。这两种参数样式都要求您提供 list 而不是 dict 的 args:

    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 交互的首选驱动程序,但该驱动程序使用 regex 将您的 SQL 和参数操作为一个带引号的字符串,然后将其发送到 MySQL。相比之下,oursql 使用准备好的语句,分别发送 SQL 和参数,eschewing the need for escaping data。 oursql方式是正确的方式,避免了困扰MySQLdb的certain bugs

    【讨论】:

    • 很好,我不知道终于有了 MySQLdb 的替代品。每个新的 Python 版本都变得更加麻烦。
    猜你喜欢
    • 2010-10-23
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2019-07-29
    • 2012-05-28
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多