Работа с базами данных в Python без ORM - PullRequest
3 голосов
/ 08 февраля 2011

Каков стандартный / рекомендуемый способ работы с базой данных (в основном MySQL) в Python?

Я не хочу ORM, и чем легче, тем лучше.Я не против написать свои собственные SELECT, но я хотел бы, чтобы что-то отображало словарь, например, для выполнения INSERT и UPDATE.Я в основном программист на PHP, и я привык делать что-то вроде этого:


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

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

Есть ли что-нибудь подобное для Python?Я посмотрел на SQLAlchemy, который, очевидно, все используют, и его «выражение SQL» выглядит неплохо, но кажется слишком излишним использование всего этого для написания необработанного SQL.

Ответы [ 2 ]

5 голосов
/ 08 февраля 2011

Чтобы использовать dict для вставок, вы ищете драйвер БД, который поддерживает "именованный" (заполнитель) paramstyle (в ссылке ищите "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 , не поддерживают "именованный" paramstyle. MySQLdb использует paramstyle "format" (используя '% s'), а oursql использует paramstyle "qmark" (используя "?"). Оба этих параметра требуют, чтобы вы поставили 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, но этот драйвер использует regex для манипулирования вашим SQL и аргументами в одну строку в кавычках, которая затем отправляется в MySQL. Напротив, oursql использует подготовленные операторы, отправляет SQL и аргументы отдельно, , избегая необходимости экранирования данных . Путь oursql является правильным и позволяет избежать определенных ошибок , которые преследуют MySQLdb.

0 голосов
/ 08 февраля 2011

Насколько я знаю, вам нужен специальный модуль для системы баз данных, с которой вы работаете. SQLite находится в стандартной библиотеке. Для mySQL попробуйте mySQLdb . Здесь есть учебник .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...