柚子快報(bào)激活碼778899分享:django連接數(shù)據(jù)庫(kù)
柚子快報(bào)激活碼778899分享:django連接數(shù)據(jù)庫(kù)
django 數(shù)據(jù)庫(kù)相關(guān)
django項(xiàng)目創(chuàng)建后有一個(gè)默認(rèn)的sqlite3數(shù)據(jù)庫(kù)
數(shù)據(jù)庫(kù)連接方式
配置數(shù)據(jù)庫(kù)的方式有很多
1.單數(shù)據(jù)庫(kù)
2.讀寫分離數(shù)據(jù)庫(kù)
3.多數(shù)據(jù)庫(kù)連接
4.主從數(shù)據(jù)庫(kù)(一主多從,多主多從)
等等
這里主要介紹我使用過(guò)的多數(shù)據(jù)庫(kù)連接
多數(shù)據(jù)庫(kù)連接方式配置
首先配置你要連接的數(shù)據(jù)庫(kù)
DATABASES = {
# mysql8.0
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': '3306',
'NAME': 'db1',
'USER': 'root',
'PASSWORD': 'root',
},
# mysql8.0
'system': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': '3306',
'NAME': 'db2',
'USER': 'root',
'PASSWORD': 'root',
}
}
數(shù)據(jù)庫(kù)映射
DATABASE_ROUTERS = ['庫(kù)名.database_router.DatabaseAppsRouter']
DATABASE_APPS_MAPPING = {
'mydefault': 'default',
'mysystem': "system",
}
在setting同級(jí)創(chuàng)建路由:database_router.py
from django.conf import settings
DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
class DatabaseAppsRouter(object):
"""
A router to control all database operations on models for different
databases.
In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
will fallback to the `default` database.
Settings example:
DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
"""
def db_for_read(self, model, **hints):
""""Point all read operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def db_for_write(self, model, **hints):
"""Point all write operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None
def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database."""
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None
def allow_syncdb(self, db, model):
"""Make sure that apps only appear in the related database."""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(model._meta.app_label) == db
elif model._meta.app_label in DATABASE_MAPPING:
return False
return None
def allow_migrate(self, db, app_label, model=None, **hints):
"""
Make sure the auth app only appears in the 'auth_db'
database.
"""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
路由文件很好理解,在多寫數(shù)據(jù)庫(kù)時(shí),模塊中的(model._meta.app_label)app_label對(duì)應(yīng)的字段去映射DATABASE_APPS_MAPPING,如果找不到返回None,找到返回?cái)?shù)據(jù)庫(kù)信息。
allow_relation是對(duì)應(yīng)兩個(gè)model對(duì)應(yīng)的數(shù)據(jù)庫(kù),兩個(gè)必須都存在,且屬于一個(gè)數(shù)據(jù)庫(kù)。
在配置數(shù)據(jù)庫(kù)時(shí)也可以選擇不使用默認(rèn)數(shù)據(jù)庫(kù)
DATABASES = {
'default': {},
# mysql8.0
'app': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': '3306',
'NAME': 'db1',
'USER': 'root',
'PASSWORD': 'root',
},
# mysql8.0
'system': {
'ENGINE': 'django.db.backends.mysql',
'HOST': 'localhost',
'PORT': '3306',
'NAME': 'db2',
'USER': 'root',
'PASSWORD': 'root',
}
}
創(chuàng)建model模塊
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(verbose_name="用戶名", max_length=64)
password = models.CharField(verbose_name="用戶密碼", max_length=64)
class Meta:
db_table = "userInfo"
app_label = 'mysystem' #指定數(shù)據(jù)庫(kù)對(duì)應(yīng)的映射
配置好以后
命令行操作
在命令終端創(chuàng)建數(shù)據(jù)庫(kù)
創(chuàng)建新的遷移文件:
python manage.py makemigrations
將應(yīng)用程序下的模型根據(jù)路由遷移到對(duì)應(yīng)的數(shù)據(jù)庫(kù)中
遷移所有數(shù)據(jù)到對(duì)應(yīng)的數(shù)據(jù)庫(kù)中
python manage.py migrate
python manage.py migrate --database=app
python manage.py migrate --database=system
至此數(shù)據(jù)庫(kù)中就創(chuàng)建好了對(duì)應(yīng)的表
重新遷移
但是當(dāng)多次修改,更新model模塊后,會(huì)創(chuàng)建很多遷移文件,那么可以通過(guò)以下方式重新創(chuàng)建遷移文件,整理成一個(gè)文件
1.檢查migrations文件夾下面的修改記錄文件是否與數(shù)據(jù)庫(kù)保持一致
python manage.py makemigrations
需要同步
2.查看當(dāng)前項(xiàng)目下所有APP對(duì)應(yīng)的已經(jīng)生效的(已經(jīng)成功執(zhí)行的)migration文件,命令如下:
python manage.py showmigrations
前面的[x]表示已經(jīng)執(zhí)行過(guò)的文件
3.重置你的APP的操作,使它們恢復(fù)到?jīng)]有執(zhí)行的狀態(tài),這里注意一下fake前面的符號(hào),是兩個(gè)“-”,另外,imooc是映射key值,記得將它替換成你的APP名字。
python manage.py migrate --fake mysystem zero
4.再次查看當(dāng)前項(xiàng)目下所有APP對(duì)應(yīng)的已經(jīng)生效的(已經(jīng)成功執(zhí)行的)migration文件,命令如下:
python manage.py showmigrations
5.然后放心大膽地刪除migrations文件夾下面,除了__init__.py文件,的所有的帶有序號(hào)的py文件,包括pycache文件夾!
6.執(zhí)行下面的命令,再次為這個(gè)APP 生成 0001_initial.py 之類的文件
python manage.py makemigrations
7.查看執(zhí)行的sql語(yǔ)句
python manage.py sqlmigrate mysystem 0001_initial
8.重新遷移數(shù)據(jù)
python manage.py migrate --database=system
用戶自己管理系統(tǒng)數(shù)據(jù)庫(kù)
有時(shí)需要自己管理整個(gè)系統(tǒng),比如用戶信息等,而且自己創(chuàng)建的表名和系統(tǒng)的數(shù)據(jù)庫(kù)名相同時(shí)
這是我們就需要將數(shù)據(jù)表轉(zhuǎn)為手動(dòng)控制模型的管理行為
model模塊設(shè)置
class Meta:
managed = False
將managed選項(xiàng)設(shè)置為False,我們可以手動(dòng)控制模型的管理行為。
managed選項(xiàng)的作用
在Django模型中,managed選項(xiàng)控制是否由Django來(lái)管理模型對(duì)應(yīng)的數(shù)據(jù)庫(kù)表。該選項(xiàng)的默認(rèn)值為True,表示Django將自動(dòng)創(chuàng)建、修改和刪除模型對(duì)應(yīng)的表。當(dāng)我們將managed選項(xiàng)設(shè)置為False時(shí),Django將不再自動(dòng)進(jìn)行數(shù)據(jù)庫(kù)表的管理操作。這對(duì)于已存在的數(shù)據(jù)庫(kù)表或者希望手動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表的情況非常有用。
配置此設(shè)置后,就不能通過(guò)命令的方式去創(chuàng)建此表,需要手動(dòng)去數(shù)據(jù)庫(kù)進(jìn)行表的創(chuàng)建
在使用手動(dòng)控制模型的管理行為之前先看看django 框架為我們提供了哪些表,各表的詳細(xì)用途,才能更好的去自己管理
柚子快報(bào)激活碼778899分享:django連接數(shù)據(jù)庫(kù)
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。