一、做項目時是先創(chuàng)模型還是先創(chuàng)建數(shù)據(jù)庫
1痒留、
正向工程:通過面向對象的模型遷移創(chuàng)建數(shù)據(jù)庫的二維表(模型相對比較簡單谴麦,沒有專業(yè)的DBA,暫時也不考慮數(shù)據(jù)訪問的優(yōu)化)
python manage.py makemigrations ——生成遷移
python manage.py migrate ——執(zhí)行遷移
反向工程:根據(jù)關系型數(shù)據(jù)庫的二維表來生成對應的模型(有專業(yè)的DBA伸头,模型比較復雜匾效,項目的規(guī)模比較大)
python manage.py inspectdb (--database XXX) >app/models.py
——》python會把默認的數(shù)據(jù)庫反向生成models.py,括號里可以選填某個數(shù)據(jù)庫反向導出模型恤磷。
說明:默認數(shù)據(jù)庫指的是defaultC婧摺!扫步!
注意:(--database XXX)中的XXX對應的是backend精绎,而不是數(shù)據(jù)庫名hrs!P科蕖代乃!
2、
如果django中配置了多個數(shù)據(jù)庫仿粹,那么需要配置數(shù)據(jù)庫路由搁吓。
我們可以這樣給各個app文件夾的models.py文件中的模型(類)添加app_label屬性打一個標簽,這樣的話我們可以通過檢查模型的app_lable來決定訪問數(shù)據(jù)庫時路由到哪個數(shù)據(jù)庫吭历。
為models.py文件中的模型添加app_label屬性
class TbEmp(models.Model):
eno = models.IntegerField(primary_key=True)
class Meta:
managed = False
db_table = 'tb_emp'
app_label = 'hrs' ——添加此屬性
為settings.py文件添加以下代碼
DATABASE_ROUTERS = [
'app.routers.AuthRouter',
]
新增routers.py文件到app文件夾下堕仔,并完成有關代碼!
路由類需要提供4個方法:
db_for_read
db_for_write
allow_relation --> True
allow_migration --> True
對應看下圖表
======================================
數(shù)據(jù)庫單表查詢時晌区,對表中屬性選擇性的查詢能提高查詢性能和節(jié)約內存摩骨,采取only方法來優(yōu)化:
emps=Models.objects.all().only('name','gender','age')
=========================
props=('ename','job','sal','comm')
emps=TbEmp.objects.all().only(*props).order_by('-sal')[:10]
在使用ORM框架處理關聯(lián)查詢,聯(lián)表查詢時如果不做任何處理將會導致1+N查詢問題朗若。如果希望使用內連接或者左外連接來優(yōu)化查詢恼五,
那么可以使用下面的方式優(yōu)化:
-select_related('關聯(lián)屬性') ——多對一
-prefetch_related('關聯(lián)屬性') ——多對多
props=('ename','job','sal','comm')
emps=TbEmp.objects.all().only(*props).select_related('外表A屬性1').select_related('外表B屬性2')
django框架中對查詢的數(shù)據(jù)分頁處理流程
1、前端傳回一個page參數(shù)哭懈,沒有則默認為第一頁灾馒;
2、查詢符合條件的模型對象(訪問數(shù)據(jù)庫)遣总,并對模型對象進行切片處理(模型對象是一個列表睬罗,故可切片)
props = ('no', 'name', 'job', 'mgr', 'sal', 'dept')
emps = Emp.objects.all().only(*props)\
.select_related('mgr').select_related('dept')\
.order_by('-sal')[(page - 1) * size:page * size]
size即為每頁的數(shù)據(jù)個數(shù)轨功,自定。
==============================================
如果django的ORM框架在功能或者性能上達不到要求那么也可以通過原生的SQl查詢來代替ORM框架的工作
django框架中如何寫原生sql代碼
1容达、連接數(shù)據(jù)庫并獲取游標
from django.db import connections古涧,connection
con=connection.cursor() #連接default數(shù)據(jù)庫并獲取游標
con=connections['dafault'].cursor()
con=connections['backend'].cursor() #連接backend對應的數(shù)據(jù)庫并獲取游標
2、編寫sql代碼
con.excude('sql代碼') #sql代碼要用引號包起來花盐,同時如果存在字符串格式化蒿褂,要用 百分號%s 占位符格式 而不用 f'{}' 格式
3、獲取數(shù)據(jù)庫返回結果
result=con.fetch() #獲取一個結果
result=con.fetchall() #獲取所有結果
result=con.fetchmany() #獲取多個結果
from django.db import connections
def data_bar(request):
names, totals = [], []
# connections['default'] <==> connection
with connections['default'].cursor() as cursor:
cursor.execute('select name, total from tb_agent t1 '
' left outer join '
' (select agentid, count(agentid) as total '
' from tb_agent_estate group by agentid) t2 '
' on t1.agentid = t2.agentid')
for row in cursor.fetchall():
names.append(row[0])
totals.append(row[1])
return JsonResponse({'x_data': names, 'y_data': totals})
============================================
pip install django -i https://pypi.doubanio.com/simple
pip install -U pip 更新pip
虛擬環(huán)境依賴項
1卒暂、將依賴項導出到文件requirment.txt
pip freeze > requirment.txt
2啄栓、將依賴項安裝到虛擬環(huán)境中
pip install requirment.txt
更改pip的配置文件
windows系統(tǒng)下的pip文件夾更改pip.ini ( cd C:\Users\Administrator\pip)
linux系統(tǒng)下.pip隱藏文件夾更改pip.conf (cd .pip)