1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/bingtel-hare

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Hare

Hare — это ORM-фреймворк, основанный на pymysql и использующий паттерн ActiveRecord. В виртуальной среде его можно установить с помощью команды: pip install hare.

На данный момент он поддерживает только MySQL.

Мотивация

В Python существует два основных подхода к работе с базами данных:

  1. Использование raw SQL.
  2. Использование ORM.

Raw SQL

Популярными инструментами для работы с raw SQL в Python являются MySQLdb и PyMySQL. Преимущество использования raw SQL заключается в том, что разработчик имеет полный контроль над выполняемыми SQL-запросами, что позволяет оптимизировать их. Недостатком является сложность написания и поддержки кода.

ORM

Наиболее популярными ORM в Python являются SQLAlchemy и Peewee. Преимуществом использования ORM является простота написания и обслуживания кода. Однако недостатком является то, что ORM могут скрывать детали реализации от разработчика, что затрудняет оптимизацию SQL-запросов. Кроме того, использование ORM может потребовать изучения сложных API, которые не всегда необходимы для небольших проектов.

Фреймворк Hare был разработан с целью создания ORM, который удовлетворял бы следующим требованиям:

  1. Простота отображения между таблицами базы данных и классами модели.
  2. Поддержка raw SQL.
  3. Отсутствие необходимости в реализации сложного API (если сложный API не требуется, его можно реализовать через raw SQL).
  4. Поддержка транзакций (как декларативных, так и императивных).

Для достижения этих целей было решено использовать паттерн Active Record.

При разработке Hare были использованы идеи из фреймворков Flask и jFinal.

jFinal

jFinal — это лёгкий Java-фреймворк для веб-разработки. Из него была заимствована идея автоматического получения структуры таблиц базы данных при запуске приложения.

Flask

Flask — это лёгкий Python-фреймворк для веб-разработки. Из него были заимствованы следующие идеи:

  • Объективизация фреймворка. Во Flask приложение создаётся с помощью конструкции app = Flask(name), которая позволяет хранить информацию о маршрутах, обработчиках и других компонентах приложения. В Hare используется аналогичная конструкция haredb = Hare(host='localhost', user='root', password='*****', db='test', charset='utf8') для создания объекта, содержащего всю необходимую информацию для работы с базой данных.
  • Декораторы. Во Flask декораторы используются для определения маршрутов обработки запросов. В Hare декораторы также используются для определения соответствия между классами моделей и таблицами базы данных, а также для управления транзакциями.

Использование 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()

API

См.

doc/api.md

Личный блог

bingtel-木犹如此

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

ORM на основе модели ActiveRecord, на нижнем уровне используется pymysql. Развернуть Свернуть
GPL-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/bingtel-hare.git
git@api.gitlife.ru:oschina-mirror/bingtel-hare.git
oschina-mirror
bingtel-hare
bingtel-hare
master