WEB接口開發與自動化測試-讀書筆記8 練習數據庫表操作

一、基本數據訪問

本節課我們學習,不通過SQL語句操作數據庫,使用Django提供的高級Python API。接下來練習數據庫表的操作,運行manage.py提供的shell命令。

1、進入shell模式

打開CMD.EXE終端

\guest> python manage.py shell
Python 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

2、操作Django模型

from sign.models import Event,Guest
導入sign應用下models.py中的Event表和Guest表

table.objects.all()
獲得table(Event、Guest表)中的所有對象

CMD.EXE終端輸入:

>>> from sign.models import Event, Guest
>>> Event.objects.all()
<QuerySet [<Event: 華爲 Mate30 發佈會>]>
>>> Guest.objects.all()
<QuerySet [<Guest: jack>]>

3、插入數據

CMD.EXE終端輸入:

>>> from datetime import datetime
>>> el = Event(id=2,name='紅米Pro發佈會',limit=2000,status=True,address='北京水立方',start_time=datetime(2019,12,13,10,0,0))
>>> el.save()
C:\Program Files\Python38\lib\site-packages\django\db\models\fields\__init__.py:1424: RuntimeWarning: DateTimeField Event.start_time received a naive datetime (2019-12-13 10:00:00) while time zone support is active.
  RuntimeWarning)
  1. start_time字段需要設置日期時間,所以先導入datetime.datetime()方法;
  2. 當保存數據時,看到:warnings.warn("DateTimeField %s received a naive datetime (%s),修改/guest/settings.py文件,設置USE_TZ=False,忽略結尾時間警告信息。
  3. 修改settings.py文件並保存,執行“quit()”命令退出shell模式,重新進入,設置可生效。

通過table.objects.create()方法將創建和保存兩步合爲一步,方法如下:
CMD.EXE終端輸入:

>>> Event.objects.create(id=3,name='紅米 K30 發佈會',limit=2000,status=True,address='北京會展中心',start_time=datetime(2019,12,14,10,0,0))
<Event: 紅米 K30 發佈會>
>>> Guest.objects.create(realname='andy',phone=13611001101,email='[email protected]',sign=False,event_id=3)
<Guest: andy>
>>>

Event指定id=3、Guest指定event_id=3,將兩者id關聯,所以嘉賓“andy”對應的是“紅米 K30 發佈會”。

4、查詢數據

table.objects.get()方法用於從數據庫查詢一條匹配結果。
CMD.EXE終端:

# 使用get()查詢name=紅米MAX發佈會的記錄
>>> e1 = Event.objects.get(name='紅米 K30 發佈會')
># 返回的結果e1是個對象
>>> e1
<Event: 紅米 K30 發佈會>
# 從e1對象獲取發佈會地址
>>> e1.address
'北京會展中心'
# 從e1對象獲取start_time的值
>>> e1.start_time
datetime.datetime(2019, 12, 14, 10, 0)
# 也可以不賦值給e1,而是直接在get()方法後加上字段名來獲取對應的值
>>> Event.objects.get(name='紅米 K30 發佈會').status
True
# 同理查詢紅米MAX發佈會的人數
>>> Event.objects.get(name='紅米 K30 發佈會').limit
2000
 如果查詢條件結果不存在則會報錯DoesNotExist
>>> Event.objects.get(name='發佈會').address
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\Program Files\Python38\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Program Files\Python38\lib\site-packages\django\db\models\query.py", line 406, in get
    raise self.model.DoesNotExist(
sign.models.Event.DoesNotExist: Event matching query does not exist.
>>>

table.objects.filter()方法用於從數據庫查詢匹配的結果。
CMD.EXE終端:

# 注意name和contains之間是雙下劃線
>>> e2 = Event.objects.filter(name__contains='發佈會')
>>> e2
<QuerySet [<Event: 華爲 Mate30 發佈會>, <Event: 紅米Pro發佈會>, <Event: 紅米 K30 發佈會>]>

通過嘉賓查詢其關聯的發佈會信息。
CMD.EXE終端:

>>> g1 = Guest.objects.get(phone='13611001101')
# 關聯查詢phone爲136……嘉賓所對應的發佈會信息event
>>> g1.event
<Event: 紅米 K30 發佈會>
#查詢這位嘉賓所參加的發佈會名稱
>>> g1.event.name
'紅米 K30 發佈會'
#查詢這位嘉賓所參加的發佈會地址
>>> g1.event.address
'北京會展中心'

5、刪除數據

通過delete()方法刪除
CMD.EXE終端:

#第一種方法
>>> g2 = Guest.objects.get(phone='13611001101')
>>> g2.delete()
(1, {'sign.Guest': 1})
#第二種方法
>>> Guest.objects.get(phone='13611001101').delete()``
(1, {'sign.Guest': 1})

6、更新數據

#查詢phone='13611001101'的嘉賓,更新realname='andy2'
>>> g3=Guest.objects.get(phone='13611001101')
>>> g3.realname='andy2'
>>> g3.save()
#直接通過update()方法更新查詢結果
>>>Guest.objects.select_for_update().filter(phone='13611001101').update(realname='andy')
1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章