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斤左右,完全吃不胖,小學六年全都過瘦,每天午餐吃兩大碗飯,下課加餐炸雞薯條配珍珠奶茶,有時候吃漢堡或三明治當下午茶,過兩個小時還能塞下晚飯。吃自助是整桌小孩裡頭食量最大的,可以不間斷的吃兩個鐘頭吃到差點走不出澳門葡京酒店的大門口。到...