1. 程式人生 > >【Mac系統 + Python + Django】之開發一個釋出會系統【Django模型(二)】 【Mac系統 + Mysql】之安裝Mysql資料庫 【Python + Mysql】之用pymysql庫連線Mysql資料庫並進行增刪改查操作

【Mac系統 + Python + Django】之開發一個釋出會系統【Django模型(二)】 【Mac系統 + Mysql】之安裝Mysql資料庫 【Python + Mysql】之用pymysql庫連線Mysql資料庫並進行增刪改查操作

上一部分給大家介紹Django的檢視

接下來繼續來了解Django框架,來看第二部分,此部分是對資料庫的操作。

 

目錄:

 

 

一、設計系統表            返回目錄

首先開啟sign/models.py,通過模型完成標的建立:

from django.db import models

# Create your models here.

# 釋出會表
class Event(models.Model):

    name 
= models.CharField(max_length=100) # 釋出會標題 limit = models.IntegerField() # 參加人數 status = models.BooleanField() # 狀態 address = models.CharField(max_length=200) # 地址 start_time = models.DateTimeField("event time") # 釋出會時間
create_time = models.DateTimeField(auto_now=True) # 建立時間(自動獲取當前時間) def __str__(self): return self.name # 嘉賓表 class Guest(models.Model): event = models.ForeignKey(Event) # 關聯釋出會id realname = models.CharField(max_length=64) # 姓名 phone = models.CharField(max_length=16) #
手機號 email = models.EmailField() # 郵箱 sign = models.BooleanField() # 簽到狀態 create_time = models.DateTimeField(auto_now=True) # 建立時間(自動獲取當前時間)
    def __str__(self):
        return self.realname
class Meta: unique_together = ("event","phone") 

模型建立好後,進行資料遷移:

開啟終端執行:

test:guest zhan$ python manage.py makemigrations sign
Migrations for 'sign':
  sign/migrations/0001_initial.py:
    - Create model Event
    - Create model Guest
test:guest zhan$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, sign
Running migrations:
  Applying sign.0001_initial... OK

  sign/migrations/下會生成0001_initial.py檔案:

 

二、admin後臺管理           返回目錄

首先,在sign/admin.py檔案中寫入:

from django.contrib import admin
from sign.models import Event,Guest

# Register your models here.
# 這些程式碼通知Admin管理工具為這些模組提供介面
admin.site.register(Event)
admin.site.register(Guest)

如下圖:

登入Admin後臺系統:http://127.0.0.1:8000/admin/ 

添加發佈會: 

列表顯示一列釋出會名字,是因為自己定義了__str__():裡面的name

如果想顯示全部的列表欄位,則在 sign/admin.py中繼續新增:

from django.contrib import admin
from sign.models import Event,Guest

# Register your models here.
# 新增兩個方法,把欄位值放在list_display中
class EventAdmin(admin.ModelAdmin):
    list_display = ["id","name","limit","status","address","start_time","create_time"]

class GuestAdmin(admin.ModelAdmin):
    list_display = ["event","realname","phone","email","sign","create_time"]


# 這些程式碼通知Admin管理工具為這些模組提供介面
admin.site.register(Event,EventAdmin)  # 並新增class進來
admin.site.register(Guest,GuestAdmin)  

還可以新增【搜尋欄、過濾器】,在sign/admin.py中繼續新增:

from django.contrib import admin
from sign.models import Event,Guest

# Register your models here.

class EventAdmin(admin.ModelAdmin):
    list_display = ["id","name","limit","status","address","start_time","create_time"]
    search_fields = ["name"]    # 搜尋欄
    list_filter = ["status"]    # 過濾器

class GuestAdmin(admin.ModelAdmin):
    list_display = ["event","realname","phone","email","sign","create_time"]
    search_fields = ["realname","phone"]    # 搜尋欄
    list_filter = ["sign"]                  # 過濾器


# 這些程式碼通知Admin管理工具為這些模組提供介面
admin.site.register(Event,EventAdmin)
admin.site.register(Guest,GuestAdmin)

search_fields:用於建立搜尋欄,可以設定匹配多個關鍵字。

list_filter:用於建立欄位過濾器。

 

三、基本資料訪問(SQLite資料庫)     返回目錄

下面我們通過Django自帶的SQLite操作資料庫,如何通過資料庫進行操作呢,需要命令列執行manage.py的shell命令

python manage.py shell

1、插入語句

# 準備條件
>>> from sign.models import Event,Guest >>> from datetime import datetime >>> Event.objects.all() <QuerySet [<Event: 小米釋出會>]> >>> Guest.objects.all() <QuerySet [<Guest: zc>]>

①第一種插入語句:建立和儲存

insert_e1 = Event(id='2',
                  name='魅族釋出會',
                  limit='1000',
                  status=True,
                  address='天津梅江會展',
                  start_time=datetime(2018,10,15,12,0,0))

insert_e1.save()

②第二種插入語句:直接建立

Event.objects.create(id='2',
                     name='魅族釋出會',
                     limit='1000',
                     status=True,
                     address='天津梅江會展',
                     start_time=datetime(2018,10,15,12,0,0))

Guest.objects.create(realname='owen',
phone= '136',
email='[email protected]',
sign=False,
event_id='2')

但是會提示警告資訊:

1430: RuntimeWarning: DateTimeField Event.start_time received a naive datetime (2018-10-15 12:00:00) while time zone support is active.
  RuntimeWarning)

UTC問題,可以忽略此問題,guest/settings.py中,設定USE_TZ = False。

2、查詢語句

(1)精確查詢

address作為查詢條件,查詢name

>>> e1 = Event.objects.get(address = '天津梅江會展')
>>> e1.name
'魅族釋出會'

# 或者

>>> Event.objects.get(address = '天津梅江會展').name
'魅族釋出會'
>>>

 

相對應的Guest表:

>>> g1 = Guest.objects.get(realname__contains='ow')
>>> g1.event
<Event: 魅族釋出會>
>>> g1.event.name
'魅族釋出會'
>>> g1.event.address
'天津梅江會展'
>>> 

(2)模糊查詢

只想查詢關鍵字

filter()方法是從資料庫中取得匹配結果,返回的是列表;name與contains雙下劃線連線,contains類似於LIKE語句。

>>> Event.objects.filter(name__contains='釋出會')
<QuerySet [<Event: 小米釋出會>, <Event: 魅族釋出會>]>
>>> 

(3)刪除資料

注:我寫的是模糊查詢刪除,最好是精確刪除。

>>> g1 = Guest.objects.get(realname__contains='ow')
>>> g1.delete()
(1, {'sign.Guest': 1})
>>> 

# 或者
>>> Guest.objects.get(realname__contains='ow').delete()
(1, {'sign.Guest': 1})
>>> 

(4)更新資料

>>> g1 = Guest.objects.get(realname__contains='ow')
>>> g1.realname='owen02'
>>> g1.save()
>>> 

# 或者

Guest.objects.select_for_update().filter(realname__contains='ow').update(realname='owen')
1

四、Django配置MySQL         返回目錄

雖然SQLite資料庫可以操作資料,但是不適用於大型專案,下面來介紹MySQL資料庫在Django中的操作。

1、安裝Mysql資料庫

參考我的另一篇文章:《【Mac系統 + Mysql】之安裝Mysql資料庫

2、MySQL資料庫基本操作

資料庫操作:

# 進入mysql
mysql -u root -p
# 檢視資料庫
show databases;

# 建立資料庫
create database if not exists guest;

# 進入guest資料庫
use guest;

# 檢視資料庫的表
show tables;

# 建立表
create table if not exists sign_guest( 
id int unsigned auto_increment, 
realname varchar(100)not null, 
phone varchar(16) not null, 
email VARCHAR(20) UNIQUE, # UNIQUE:不可重複,只有null是可以重複 
sign varchar(5), 
create_time date, 
primary key(id,phone) 
)charset=utf8;

# 查看錶屬性
desc sign_guest;

# 插入資料
insert into sign_guest(realname,phone,email,sign,create_time)values
('zc','16612345678','[email protected]','1',now())

3、安裝pymysql

安裝命令:

pip install pymysql  

具體操作可參考我的文章:《【Python + Mysql】之用pymysql庫連線Mysql資料庫並進行增刪改查操作

在此忽略......

4、在Django中配置MySQL

修改guest/settings.py下的DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',   # 驅動
        'HOST': '127.0.0.1',                    # 主機地址
        'PORT': '3306',                         # 埠號
        'NAME': 'guest',                        # 資料庫
        'USER': 'root',                         # 登入使用者名稱
        'PASSWORD': '1234567',                  # 登入密碼
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
        },
    }
}

在guest專案中輸入命令:

test:guest zhan$ python manage.py migrate

但是報錯:

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named 'MySQLdb'

原因為沒有MySQLdb驅動,解決辦法如下:

在.../guest/__init__.py中新增程式碼:

import pymysql

pymysql.install_as_MySQLdb()

然後再執行命令:

python manage.py migrate

但是,會提示錯誤,如果沒有問題跳過此段落:

......

Applying auth.0006_require_contenttypes_0002... OK

Applying auth.0007_alter_validators_add_error_messages... OK

Applying auth.0008_alter_user_username_max_length... OK

Applying sessions.0001_initial... OK

Applying sign.0001_initial...Traceback (most recent call last):

...

...

...

pymysql.err.InternalError: (1050, "Table 'sign_guest' already exists")

 

原因為我在上面寫mysql基本資料庫操作時候,自己建立了sign_guest表,所以最好刪除guest資料庫,重新再執行一遍命令。

終端進入資料庫,具體操作不描述,上面基本操作介紹過。

# 刪除資料庫
drop database guest;

# 建立資料庫
create database guest;

 

再執行命令:

python manage.py migrate

正確顯示如下:

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, sign
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK
  Applying sign.0001_initial... OK

因為更換了資料庫,所以裡面的Admin超級管理員賬號也需要重新建立。

然後再終端輸入命令:

python manage.py createsuperuser
Username (leave blank to use 'zhan'): admin
Email address: xxx@xxx.com
Password: 
Password (again): 
Superuser created successfully.

 

至此,Django的模型建立完畢,下一篇介紹Django模板