那麼今天要來看看,怎麼在django裡面看到django本身組合出來的SQL呢!?
這個也只是我單純好奇,常常聽到有人會說用ORM生出來的SQL效能不佳等等的評語,不過今天我們只是單純看看django生成出來的SQL而已,並不會討論效能這項問題就是了,我自己是很喜歡使用ORM,因為寫ORM讓我感覺程式碼看起來的樣子比較舒服,當然這只是個人觀感~SQL還是很重要的!要會!
今天一共會有三種方式來看django生成的SQL~
其中一種是看migration會對django下什麼指令,另外兩種則是看django接受到request後在我們view下ORM的SQL~
python manage.py sqlmigrate "app name" "migrations number like 0001"
首先呢就是sqlmigrate指令啦~
我的migration長這樣,檔名"0001_initial.py"
# Generated by Django 4.2.5 on 2023-09-27 11:09
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Person',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
],
options={
'db_table': 'person',
},
),
migrations.CreateModel(
name='Todo',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('complete', models.BooleanField(default=False)),
],
options={
'db_table': 'todolist',
},
),
]
而指令下完會跑出
BEGIN;
--
-- Create model Person
--
CREATE TABLE "person" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "name" varchar(255) NOT NULL);
--
-- Create model Todo
--
CREATE TABLE "todolist" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(255) NOT NULL, "complete" bool NOT NULL);
COMMIT;
挺有趣的~有興趣的可以自己去翻翻這個指令sqlmigrate的原始碼!
django的log其實我還是看得模糊模糊的,他設定很豐富,所以會需要花時間去看要怎麼寫~
參考文件
簡單的在settings.py當中加入這個
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
就可以在console中看到印出來的sql囉!我們光是runserver就可以看到了XD
(0.000)
SELECT name, type FROM sqlite_master
WHERE type in ('table', 'view') AND NOT name='sqlite_sequence'
ORDER BY name; args=None; alias=default
(0.000) SELECT "django_migrations"."id", "django_migrations"."app", "django_migrations"."name", "django_migrations"."applied" FROM "django_migrations"; args=(); alias=default
我們在這邊使用django的admin後台新增看看!
簡單的新增一個person,然後觀察一下!
(0.000) BEGIN; args=None; alias=default
(0.001) INSERT INTO "person" ("name") VALUES ('john') RETURNING "person"."id"; args=('john',); alias=default
(0.002) INSERT INTO "django_admin_log" ("action_time", "user_id", "content_type_id", "object_id", "object_repr", "action_flag", "change_message") VALUES ('2023-10-05 12:35:35.362862', 1, 1, '1', 'Person object (1)', 1, '[{"added": {}}]') RETURNING "django_admin_log"."id"; args=('2023-10-05 12:35:35.362862', 1, 1, '1', 'Person object (1)', 1, '[{"added": {}}]'); alias=default
(0.001) COMMIT; args=None; alias=default
大概這一串,就可以看到生成的sql啦!
套件當然就要先安裝囉~pip install django-debug-toolbar
這裡~
然後稍微設定一下settings.py,跟著docs走!
在settings.py加
INSTALLED_APPS = [
# ...
"debug_toolbar"
# ...
]
# 這個要加在第一個
MIDDLEWARE = [
"debug_toolbar.middleware.DebugToolbarMiddleware",
# ...
]
INTERNAL_IPS = [
"127.0.0.1",
]
然後urls.py上面加
urlpatterns = [
# ...
path("__debug__/", include("debug_toolbar.urls")),
]
之後打開我們剛剛的admin頁面,就可以看到他的debug工具囉!
然後點個SQL就可以看到這個頁面django下了多少sql了!
是不是挺有趣的!
改天再研究研究他是怎麼寫的~
debug toolbar也是我在做鐵人賽時候找到的,當時就是想要把SQL印出來google找了一些方法,剛好看到有個日本人在介紹debug toolbar而我剛好又會日文就看了一下,文章在這,發現這個東西真不錯!