ORM
ORM是Object Relation mappiong,簡單來說就是將編程語言中的對象映射到數據庫中。這邊的對象就是數據庫中的各種表,ORM模型作用在于編程人員更換數據庫引擎時,不必每次重新編寫sql語句,只要通過編程語言自動生成對應的sql語句,這樣大大地提升了效率。
python下的ORM:在應用目錄下的models下可以編寫要映射到數據庫的表,格式如下
class Book(models.Model): id = models.AutoField(primary_key=True) #auto為自增型 title = models.CharField(max_length=32) #char為字符型 state = models.BooleanField() #Boolean為布爾型 pub_data = models.DateField() #Date為日期型 price = models.DecimalField(max_digits=8,decimal_places=2) #Decimal為十進制小數 publish = models.CharField(max_length=32)
其中數據類型和mysql很多相似,只是語法變了。
django引入ORM時,要在主目錄下的_init__文件下寫入:
import pymysql pymysql.install_as_MySQLdb()
因為django默認的數據庫驅動為MySQLdb,python3與其兼容有問題,所以要是用pymysql作為驅動。
同時主目錄下settings文件中的databases屬性要改為:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql',#引擎驅動 'NAME': 'orm', #數據庫名 'USER': 'root', #用戶名 'password': '', #密碼 'HOST': '127.0.0.1', #ip 'port': 3306, #端口號 } }
注意事項:python3.4以上版本和django2.0以上版本共同使用時,會報錯。因為MySQLclient只支持到python3.4,所以要將項目下的報錯的目錄,Lib\site-packages\django\db\backends\mysql\中的如下代碼注釋。
if version < (1, 3, 13): raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)
然后使用python(python3) manage.py makemigrations:

再使用python manage.py migrate:

最后在mysql數據庫中可以看到新建的表:

產生了一個app01_book的表,還有一些其他自動生成的很多表。其中app01_book的字段:

最后如果想在控制臺看到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', }, } }
一、單表操作
當model下創建了表類時,在views下可以控制表的操作
(1)添加
def index(request): #添加記錄 # 方式1: # book_obj = Book(id=1,title='pythonredbook',state=True,price=100,pub_data='1019-6-28', # publish='cn') # book_obj.save() # 方式2:create返回的就是對象記錄 Book.objects.create(title='linux',state=False,price=88,pub_data='2020-6-28' ,publish='ua') return HttpResponse('ok')
在mysql數據里可以看到創建的表記錄

(2)查詢和模糊查詢
查詢:
book_list = Book.objects.all() #返回的是一個列表對象,一個對象里存一個字段
book_list = Book.objects.all().first()#調用者時queryset對象,返回model對象 book_list = Book.objects.all()[0]#和first一樣 book_list = Book.objects.filter(prince=100)#filter類似于sql的where語句,括號里的是條件 book_list = Book.objects.filter(prince=100).first() book_list = Book.objects.get(title='linux')#有且只有一個才會返回,否則報錯
book_list = Book.objects.exclude(title='linux')#和filter相反,打印出除了符合括號里的其他數據
book_list = Book.objects.all().order_by('id') #排序,默認是ASC升序
book_list = Book.objects.all().order_by('-id')#-號是desc降序
book_list = Book.objects.all().order_by('id').reverse()#反轉排序
book_list = Book.objects.all().count()#計數
book_list = Book.objects.all().values('price')#以字典形式返回對象price的值
book_list = Book.objects.all().values_list('price','title')#以元祖形式返回對象price、title的值
book_list = Book.objects.all().distinct()#去重,一樣的字段的記錄只取一條,配合values使用比較好
模糊查詢:指的是 > < 等。
book_list = Book.objects.filter(price__gt=10,price__lt=200)#價格大于10小于200 book_list = Book.objects.filter(title__startswith='py')#以py開頭的title記錄 book_list = Book.objects.filter(title__contains='py')#title包含'py'的,區別大小寫 book_list = Book.objects.filter(title__icontains='py')#title包含'py'的,不區分大小寫 book_list = Book.objects.filter(price__in=[100,200,300])#判斷是在列表中的數據 book_list = Book.objects.filter(price__range=[100,200])#相當于lt和gt的同時使用 book_list = Book.objects.filter(pub_data_year=2019)#只有date數據類型可以使用
(3)刪除和修改
book_list = Book.objects.filter(price=100).delete()#刪除price=100的記錄 book_list = Book.objects.filter(price=100).update(price=300)#修改price=100的記錄變為300
浙公網安備 33010602011771號