1. 程式人生 > 其它 >Django框架補充之單表操作

Django框架補充之單表操作

單表操作

1 按步驟建立表

1.1 建立django專案,新建名為app01的app,在app01的models.py中建立模型
class Employee(models.Model): # 必須是models.Model的子類
    id=models.AutoField(primary_key=True)

    name=models.CharField(max_length=16)

    gender=models.BooleanField(default=1)

    birth=models.DateField()

    department=models.CharField(max_length=30)
salary
=models.DecimalField(max_digits=10,decimal_places=1)
1.2 django的orm支援多種資料庫,如果想將上述模型轉為mysql資料庫中的表,需要settings.py
# 刪除\註釋掉原來的DATABASES配置項,新增下述配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # 使用mysql資料庫
        'NAME': 'db1',          # 要連線的資料庫
        'USER': 'root',         #
連結資料庫的用於名 'PASSWORD': '', # 連結資料庫的用於名 'HOST': '127.0.0.1', # mysql服務監聽的ip 'PORT': 3306, # mysql服務監聽的埠 'ATOMIC_REQUEST': True, #設定為True代表同一個http請求所對應的所有sql都放在一個事務中執行 #(要麼所有都成功,要麼所有都失敗),這是全域性性的配置,如果要對某個
#http請求放水(然後自定義事務),可以用non_atomic_requests修飾器 'OPTIONS': { "init_command": "SET storage_engine=INNODB", #設定建立表的儲存引擎為INNODB } } }
1.4 其實python直譯器在執行django程式時,django的orm底層操作資料庫的python模組預設是mysqldb而非pymysql,然而對於直譯器而言,python2.x直譯器支援的操作資料庫的模組是mysqldb,而python3.x直譯器支援的操作資料庫的模組則是pymysql,,毫無疑問,目前我們的django程式都是運行於python3.x直譯器下,於是我們需要修改django的orm預設操作資料庫的模組為pymysql
1.5 確保配置檔案settings.py中的INSTALLED_APPS中新增我們建立的app名稱,django2.x與django1.x處理新增方式不同
# django1.x版本,在下述列表中新增我們的app名字即可
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
    # 'app02' # 若有新增的app,依次新增即可
]

# django2.x版本,可能會幫我們自動新增app,只是換了一種新增方式
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config', # 如果預設已經添加了,則無需重複新增
    # 'app02.apps.App02Config', # 若有新增的app,按照規律依次新增即可
]
1.6 如果想列印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',
        },
    }
}
1.7 最後在命令列中執行兩條資料庫遷移命令,即可在指定的資料庫db1中建立表 :
$ python manage.py makemigrations
$ python manage.py migrate

# 注意:
# 1、makemigrations只是生成一個數據庫遷移記錄的檔案,而migrate才是將更改真正提交到資料庫執行
# 2、資料庫遷移記錄的檔案存放於app01下的migrations資料夾裡
# 3、瞭解:使用命令python manage.py showmigrations可以檢視沒有執行migrate的檔案
1.8 在表生成之後,如果需要增加、刪除、修改表中欄位,需要這麼做
# 一:增加欄位
#1.1、在模型類Employee裡直接新增欄位,強調:對於orm來說,新增的欄位必須用default指定預設值
publish = models.CharField(max_length=12,default='人民出版社',null=True)
#1.2、重新執行那兩條資料庫遷移命令


# 二:刪除欄位
#2.1 直接註釋掉欄位
#2.2 重新執行那兩條資料庫遷移命令

# 三:修改欄位
#2.1 將模型類中欄位修改
#2.2 重新執行那兩條資料庫遷移命令

2 新增記錄

# 1、用模型類建立一個物件,一個物件對應資料庫表中的一條記錄
obj = Employee(name="Egon", gender=0, birth='1997-01-27', department="財務部", salary=100.1)
# 2、呼叫物件下的save方法,即可以將一條記錄插入資料庫
obj.save()

3 查詢記錄

mysql> select * from app01_employee;
+----+-------+--------+------------+------------+--------+
| id | name  | gender | birth      | department | salary |
+----+-------+--------+------------+------------+--------+
|  1 | Egon  |      0 | 1997-01-27 | 財務部     |  100.1 |
|  2 | Kevin |      1 | 1998-02-27 | 技術部     |   10.1 |
|  3 | Lili  |      0 | 1990-02-27 | 運營部     |   20.1 |
|  4 | Tom   |      1 | 1991-02-27 | 運營部     |   30.1 |
|  5 | Jack  |      1 | 1992-02-27 | 技術部     |   11.2 |
|  6 | Robin |      1 | 1988-02-27 | 技術部     |  200.3 |
|  7 | Rose  |      0 | 1989-02-27 | 財務部     |   35.1 |
|  8 | Egon  |      0 | 1997-01-27 | 財務部     |  100.1 |
|  9 | Egon  |      0 | 1997-01-27 | 財務部     |  100.1 |
+----+-------+--------+------------+------------+--------+

4 修改記錄

# 1、獲取記錄物件
obj=Employee.objects.filter(name='Egon')[0]
# 2、修改記錄物件屬性的值
obj.name='EGON'
obj.gender=1
# 3、重新儲存
obj.save()

5 刪除記錄

5.1 直接刪除單條記錄

obj=Employee.objects.first()
obj.delete()

5.2 刪除QuerySet中的所有記錄物件

queryset_obj=Employee.objects.filter(id__gt=5)
rows=queryset_obj.delete()