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