Hare
Hare — это ORM-фреймворк, основанный на pymysql и использующий паттерн ActiveRecord. В виртуальной среде его можно установить с помощью команды: pip install hare.
На данный момент он поддерживает только MySQL.
Мотивация
В Python существует два основных подхода к работе с базами данных:
Raw SQL
Популярными инструментами для работы с raw SQL в Python являются MySQLdb и PyMySQL. Преимущество использования raw SQL заключается в том, что разработчик имеет полный контроль над выполняемыми SQL-запросами, что позволяет оптимизировать их. Недостатком является сложность написания и поддержки кода.
ORM
Наиболее популярными ORM в Python являются SQLAlchemy и Peewee. Преимуществом использования ORM является простота написания и обслуживания кода. Однако недостатком является то, что ORM могут скрывать детали реализации от разработчика, что затрудняет оптимизацию SQL-запросов. Кроме того, использование ORM может потребовать изучения сложных API, которые не всегда необходимы для небольших проектов.
Фреймворк Hare был разработан с целью создания ORM, который удовлетворял бы следующим требованиям:
Для достижения этих целей было решено использовать паттерн Active Record.
При разработке Hare были использованы идеи из фреймворков Flask и jFinal.
jFinal
jFinal — это лёгкий Java-фреймворк для веб-разработки. Из него была заимствована идея автоматического получения структуры таблиц базы данных при запуске приложения.
Flask
Flask — это лёгкий Python-фреймворк для веб-разработки. Из него были заимствованы следующие идеи:
Использование Hare
База данных состоит из следующих уровней: библиотека → таблица → поле. Hare также следует этой иерархии.
Пользователь предоставляет конфигурацию соединения с базой данных, которая соответствует одному источнику данных (Database). Пример создания источника данных: haredb = Hare( host='localhost', user='root', password='********', db='test', charset='utf8').
Предположим, что в базе данных test уже создана таблица user:
USER_TABLE = """CREATE TABLE user
(
uid
int(11) NOT NULL AUTO_INCREMENT,
nickname
varchar(20) DEFAULT NULL,
email
varchar(20) DEFAULT NULL,
PRIMARY KEY (uid
)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8"""
С помощью декоратора можно объявить, какие таблицы существуют в базе данных (в данном случае, есть таблица user, соответствующая классу User): @haredb.table('user') class User(haredb.Model): pass
Пример использования Hare:
#! -*- coding: utf-8 -*-
from __future__ import absolute_import
import logging
from traceback import format_exc
from hare import Hare
# 创建一个Hare对象, 作为数据源
# 会使用默认的logger来记录执行的sql
haredb = Hare(
host='localhost', user='root',
password='********', db='test',
charset='utf8')
# 创建一个自定义logger的数据源
logger = logging.getLogger('hare')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
haredb = Hare(
host='localhost', user='root',
password='********', db='test',
charset='utf8',
logger=logger)
# 将user表和User类绑定
@haredb.table('user')
class User(haredb.Model):
pass
# 获取所有的表名
# 返回 ['user']
print haredb.tables
# 获取User类对应的 table object
table = User.table
# 输出表名称
print table.name
# 清空User表
table.truncate()
# 判断字段是否属于该表
print table.is_column('uid')
print table.is_column('uid_not_exists')
# 新建一条记录
u = User()
u.set_many(**{'nickname': 'haha', 'email': 'a@q.com'}).save()
# 获取主键
print u.uid
# 获取一条记录
u = User.get(uid=1)
# 修改字段的值
u.nickname = 'new name'
u.update()
# 删除该对象
u.delete()
# 获取所有的用户记录
# 每个元素 является dict
users = User.select_many()
# 查询符合条件的所有记录
# каждый элемент является dict
users = User.select_many(email='a@q.com')
# 分页查询User таблицы
pagination = User.paginate(params={'nickname': ('is not', None)}, page=1, per_page=10)
print pagination.items
# 获取一个 соединения с базой данных
dbi = haredb.dbi
# выполнение row sql
# одна запись
users = dbi.select(u'SELECT * FROM user WHERE uid = 10')
# несколько записей
users = dbi.select_many(u'SELECT * FROM user WHERE uid > 10')
# выполнение операции записи
dbi.modify(u'DELETE FROM user WHERE uid = %s', 1)
# пакетная операция записи
rows = [{'nickname': 'test', 'email': 'test@qq.com'}].
``` ```
dbi.modify_many(u'INSERT INTO user(nickname, email) VALUES(%(nickname)s, %(email)s)', rows)
# 执行事务
@haredb.tx
def save_user():
user = User().set_many(**{'nickname': 'test2'})
user.save()
# 1/0 取消注释该行,则保存失败
# 执行事务的另外一种方式
def save_user2():
user = User().set_many(**{'nickname': 'test2'})
user.save()
# 1/0 取消注释该行,则保存失败
with haredb.get_tx() as tx:
try:
save_user2()
except:
logging.error(format_exc())
tx.rollback()
else:
tx.commit()
print User.select_many()
См.
doc/api.md
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )