ORM介紹
ORM概念
對象關係映射(Object Relational Mapping,簡稱ORM)模式是一種爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術。
簡單的說,ORM是通過使用描述對象和數據庫之間映射的元數據,將程序中的對象自動持久化到關係數據庫中。
ORM在業務邏輯層和數據庫層之間充當了橋樑的作用。
ORM由來
讓我們從O/R開始。字母O起源於"對象"(Object),而R則來自於"關係"(Relational)。
幾乎所有的軟件開發過程中都會涉及到對象和關係數據庫。在用戶層面和業務邏輯層面,我們是面向對象的。當對象的信息發生變化的時候,我們就需要把對象的信息保存在關係數據庫中。
按照之前的方式來進行開發就會出現程序員會在自己的業務邏輯代碼中夾雜很多SQL語句用來增加、讀取、修改、刪除相關數據,而這些代碼通常都是重複的。
ORM優勢
ORM解決的主要問題是對象和關係的映射。它通常把一個類和一個表一一對應,類的每個實例對應表中的一條記錄,類的每個屬性對應表中的每個字段。
ORM提供了對數據庫的映射,不用直接編寫SQL代碼,只需像操作對象一樣從數據庫操作數據。
讓軟件開發人員專注於業務邏輯的處理,提高了開發效率。
ORM的劣勢
ORM的缺點是會在一定程度上犧牲程序的執行效率。
ORM用多了SQL語句就不會寫了,關係數據庫相關技能退化…
ORM總結
ORM只是一種工具,工具確實能解決一些重複,簡單的勞動。這是不可否認的。
但我們不能指望某個工具能一勞永逸地解決所有問題,一些特殊問題還是需要特殊處理的。
但是在整個軟件開發過程中需要特殊處理的情況應該都是很少的,否則所謂的工具也就失去了它存在的意義。
Django模塊的settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'bms', # 要連接的數據庫,連接前需要創建好
'USER': 'root', # 連接數據庫的用戶名
'PASSWORD': '123456', # 連接數據庫的密碼
'HOST': '127.0.0.1', # 連接主機,默認本級
'PORT': 3306 # 端口 默認3306
}
}
注意1:NAME即數據庫的名字,在mysql連接前該數據庫必須已經創建,而上面的sqlite數據庫下的db.sqlite3則是項目自動創建 USER和PASSWORD分別是數據庫的用戶名和密碼。設置完後,再啓動我們的Django項目前,我們需要激活我們的mysql。然後,啓動項目,會報錯:no module named MySQLdb 。這是因爲django默認你導入的驅動是MySQLdb,可是MySQLdb 對於py3有很大問題,所以我們需要的驅動是PyMySQL 所以,我們只需要找到項目名文件下的__init__,在裏面寫入:
import pymysql
pymysql.install_as_MySQLdb()
先建數據庫(Python無法建數據庫)
models.py建表結構
from django.db import models
# Create your models here.
class Book(models.Model):
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=32)
state=models.BooleanField()
pub_date=models.DateField()
price=models.DecimalField(max_digits=8,decimal_places=2)
publish=models.CharField(max_length=32)
最後通過兩條數據庫遷移命令即可在指定的數據庫中創建表 :
python3 manage.py makemigrations
python3 manage.py migrate
注意2:確保配置文件中的INSTALLED_APPS中寫入我們創建的app名稱
然後在view.py調用的時候,導入models.book(表名)
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
"App01"
]
注意3: 如果想打印orm轉換過程中的sql,需要在settings中進行如下配置(在命令行中打印出來):
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
插入表的方法
第一種
book_obj = book(id=1,name="aaa",price=200)
book_obj.save()
第二種
book_obj = book.objects.create(id=1,name="aaa",price=200)