Django 分表 怎麼實現?

時間 2021-06-06 12:33:03

1樓:

做了個demo實現,支援基於固定分片數量的分表和基於年、月、日的動態日期分表,根據日期設定項自動建立不存在的日期資料模型,並自動進行資料庫migration遷移,建立對應的資料庫表,支援分表的分頁。

詳細見github示例原始碼:

Django分表示例

2樓:

需要將某張表按照時間點,每個月來儲存一張。

需要自動建立該錶

不影響現有的migrations操作

能在現網環境中切換到新錶無縫隙切換到新錶

參考https://stackoverflow.com/questions/5036357/single-django-model-multiple-tables

根據不同時間去建立新的model,該model跟原有的model一樣,只是此時的tb_table(表名)不一樣。

對於建立的新的model,如果存在該錶,則直接返回,不存在,則通過原生的sql去執行建立表命令,返回該錶

應急方案,通過捕獲異常,返回最原始的model物件

models.py中已存在一張準備分表的表

from django.db import models

class User(models.Model):

id = models.IntegerField(primary_key=True)

name = models.CharField(max_length=20)

age = models.IntegerField(default=0def __str__(selfreturn "%s:%s" % (str(self.

id), self.name)

class Metaabstract = True

db_table = "user"

通過複製User本身的Fields,建立不同的表,同乙個model

def __create_user_model(db_table2):

''':param db_table2:表名

:return:

'''class MyClassMetaclass(models.base.ModelBasedef __new__(cls, name, bases, attrsname += db_table2return models.

base.ModelBase.__new__(cls, name, bases, attrs)

class MyClass(models.Modelmetaclass__ = MyClassMetaclass

id = models.IntegerField(primary_key=Truename = models.CharField(max_length=20age = models.

IntegerField(default=0class Metadb_table = db_table2

return MyClass

需要對外提供乙個方法,該方法可以類似model呼叫,比方:User.objects.create()

def get_user_db39;''

return:資料庫的名字,根據自己定義的資料庫略作調整

'''from django.db import connection

return connection.settings_dict["NAME"]

def exe_sql(sql):

from django.db import connection

# connection = connections["default"]

cr = connection.cursor()

cr.execute(sql)

tryconnection.commit()

exceptpass

return cr

import datetime,traceback

def get_diy_user_model39;''

:return:會返回乙個當前月份的一張表:user_2019_1

'''dt = datetime.datetime.now()

current_table_suffix = "_%s_%s" % (dt.year, dt.month)

current_table = User._meta.db_table + current_table_suffix

create_sql = """CREATE TABLE `%s` (

`id` int(11) NOT NULL,

`name` varchar(20) NOT NULL,

`age` int(11) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

"""trySQL = """SELECT count(*) AS is_existFROM information_schema.tablesWHERE table_schema = '%s'AND table_name = '%sཞ"" % (get_user_db(), current_tablecr = exe_sql(SQLis_exist = cr.fetchall()[0][0if not is_existexe_sql(create_sql % current_tablereturn __create_user_model(db_table2=current_table)

exceptprint(traceback.print_excreturn User

先執行django自帶的遷移方法

python3 manage.py makemigrations

python3 manage.py migrate

django shell呼叫方法

python3 manage.py shell

userModel = get_diy_user_model().objects.create(id=1,name="zhangsan",age=18)

userModel._meta.db_table

最後看看是不是你想要的結果??

這種方式算是我自己來解決用同乙個model,分不同表的策略。不過目前還沒經過併發驗證,所以暫且大家了解一下就好。

Django中,reverse()函式怎麼推導出url

耳朵會火 urlpatterns url r blog include blog.urls namespace blog urlpatterns url r views.index blog,name home url r edit action views.edit action,name edi...

pip安裝django遇到錯誤,怎麼解決?

記錄一下吧,ubuntu 16.04,使用 apt get install python dev python pip 執行pip install django出現如答主所貼錯誤,使用 pip install no use wheel upgrade distribute 後報錯 ImportErr...

使用redis和zookeeper實現分布式鎖

可能是只假的驢子 我初中以前是跳民族同時也學芭蕾,159公分大概76斤左右,完全吃不胖,小學六年全都過瘦,每天午餐吃兩大碗飯,下課加餐炸雞薯條配珍珠奶茶,有時候吃漢堡或三明治當下午茶,過兩個小時還能塞下晚飯。吃自助是整桌小孩裡頭食量最大的,可以不間斷的吃兩個鐘頭吃到差點走不出澳門葡京酒店的大門口。到...