Django应用程序的简单数据库分片(水平分区)库。

django-horizon的Python项目详细描述


Django地平线

https://travis-ci.org/uncovertruth/django-horizon.svg?branch=masterhttps://api.codacy.com/project/badge/Grade/6f4ba73576904beaa41d68f40970bda9https://codebeat.co/badges/74f07702-68ed-47e7-91e6-9088b0532342https://www.codefactor.io/repository/github/uncovertruth/django-horizon/badgehttps://codecov.io/gh/uncovertruth/django-horizon/branch/master/graph/badge.svgDocumentation StatusUpdatesPython 3https://img.shields.io/pypi/v/django-horizon.svg

目的

Django应用程序的简单数据库分片(水平分区)库。

Logo

功能

  • 通过一些ForeignKey字段(如用户帐户)进行切分(水平分区)。

安装

要安装django horizon,请在终端中运行此命令:

$ pip install django-horizon

这是安装django horizon的首选方法,因为它总是安装最新的稳定版本。

如果您没有安装pip,这个Python installation guide可以指导 你完成了整个过程。

使用量

设置

settings.py

中添加数据库路由器配置
水平数据库组和元数据存储
HORIZONTAL_CONFIG={'GROUPS':{'group1':{# The name of database horizontal partitioning group'DATABASES':{1:{'write':'member1-primary','read':['member1-replica-1','member1-replica-2'],# Pick randomly by router},2:{'write':'member2-primary','read':['member2-replica'],},3:{'write':'a3',# Used by 'read' too},},'PICKABLES':[2,3],# Group member keys to pick new database},},'METADATA_MODEL':'app.HorizontalMetadata',# Metadata store for horizontal partition key and there database}
数据库路由器
DATABASE_ROUTERS=('horizon.routers.HorizontalRouter',...)

示例模型

按用户划分的水平分区

元数据存储
fromhorizon.modelsimportAbstractHorizontalMetadataclassHorizontalMetadata(AbstractHorizontalMetadata):pass

在本例中,元数据存储保存以下内容。

  • group:水平分区的组名。
  • key:确定表记录在水平分区组中的分布。
  • index:在水平分区组中选择了数据库索引。
分片型
fromdjango.confimportsettingsfromhorizon.managerimportHorizontalManager# For Django<1.10fromhorizon.modelsimportAbstractHorizontalModelclassSomeLargeModel(AbstractHorizontalModel):user=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.DO_NOTHING,db_constraint=False,# May be using anothor database)...objects=HorizontalManager()# For Django<1.10classMeta(object):horizontal_group='group1'# Group namehorizontal_key='user'# Field name to use group key

在许多情况下,UUIDField字段用于id。 默认情况下,AbstractHorizontalModel使用UUIDField作为他们的id字段。

使用型号
fromdjango.contrib.authimportget_user_modeluser_model=get_user_model()user=user_model.objects.get(pk=1)# Get by foreign instanceSomeLargeModel.objects.filter(uses=user)# Get by foreign idSomeLargeModel.objects.filter(uses_id=user.id)
型号限制
  • django.db.utils.IntegrityError未指定要筛选的水平键字段时发生

    SomeLargeModel.objects.all()
  • 无法按外键字段查找,因为存在其他(如default)数据库

    list(user.somelargemodel_set.all())

历史记录

1.1.2(2018-11-15)

  • _create_object_from_params更新为新接口
  • 添加对django 2.1的支持
  • 添加对Python3.7的支持

1.1.1(2018-08-03)

  • 迁移到^ {TT10}$作为MIXIN

1.1.0(2018-03-30)

  • 放弃对django 1.9、1.10的支持

1.0.0(2018-02-02)

  • 添加对django 2.0的支持
  • 放弃对django 1.8的支持

0.0.1(2017-05-22)

  • pypi上的第一个版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
图形Java仿射变换以旋转通用路径   IntelliJ IDEA中的java代码标记为编译器错误,在Eclipse中可以正常工作   java ArrayList的containsAll返回了错误的值   如何在安卓中的片段活动中添加java代码   java通过使用netbeans调用jbutton,将带有行的jbutton添加到jtable中   java在更新arrayAdapter/listView之前更新最终列表   java如何在另一个项目中导入包含AspectJ方面和注释的项目   为什么我的java布尔测试总是失败?   Eclipse中的java自动激活   在Bluetooth for Java(更具体地说是Android)之上是否有TCP/IP协议栈实现?   java Android Studio通过intent传递ArrayList并填充ListView