메인 콘텐츠로 건너뛰기
블로그 데이터베이스 장고가 SQL에 대한 무거운 짐을 드는 방법

장고가 SQL에 대한 무거운 리프팅을하는 방법

Django가 무거운 물건을 드는 방법 - 블로그 헤더

Python, 특히 Django는 더 적은 코드로 더 효율적인 애플리케이션을 구축하고 확장성이 뛰어난 데이터베이스에 연결하는 데 필수적입니다. SQL을 사용하여 최신 애플리케이션을 구축하고 지원하는 데 따르는 일상적인 마찰을 줄이는 방법에 대해 이야기하기 위해 왔습니다. Python 복잡성을 추상화하고 우리의 직업과 삶을 조금 더 쉽게 만듭니다.

잡초에 들어 가지 않고 다음을 가정 할 수 있습니다.

  • SQL은 SQL 데이터베이스에 최적화되어 있습니다.
  • Python SQL 데이터베이스에 최적화되어 있지 않습니다 .

이 연습은 데이터베이스 이해 eBook 과 새로운 Linode LIVE! 교육 시리즈 사용 Python 실제로 SQL을 작성할 필요없이 원시 SQL에서 명령을 실행하는 Pythonic 도구입니다. 장고의 데이터 모델링을 사용하고 있지만 구문은 SQLAlchemy 패키지와 매우 유사합니다. Python.

시작하자!
다음은 Django 데이터 모델의 예입니다.

class BlogArticle(models.Model):
    user = models.ForeignKey(User, default=1, on_delete=models.SET_DEFAULT)
    title = models.CharField(max_length=120)
    slug = models.SlugField(blank=True, null=True)
    content = models.TextField(blank=True, null=True)
    publish_timestamp = models.DateTimeField(
        auto_now_add=False,
        auto_now=False,
        blank=True,
        null=True,
    )

이 모델이 Django 앱에 있다고 가정 해 봅시다. Articles (Django 앱은 본질적으로 Django 프로젝트 전체를 구성하는 구성 요소입니다.)

이제 작업할 두 가지 이름이 있습니다.

  • Articles (앱 이름)
  • BlogArticle (모델명)

조합하여 SQL 테이블 이름으로 변환됩니다.

articles_blog_article

장고는 우리를 위해이 마술을합니다.

MySQL 셸을 사용하는 경우 다음을 볼 수 있습니다.

mysql> SHOW TABLES;
+------------------------------+
| Tables_in_cfe_django_blog_db |
+------------------------------+
| articles_blog_article        |
| auth_group                   |
| auth_group_permissions       |
| auth_permission              |
| auth_user                    |
| auth_user_groups             |
| auth_user_user_permissions   |
| django_admin_log             |
| django_content_type          |
| django_migrations            |
| django_session               |
+------------------------------+
11 rows in set (0.01 sec)

이제 Django 모델의 열을 살펴보겠습니다.

mysql> DESCRIBE articles_blog_article;
+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| id                     | bigint       | NO   | PRI | NULL    | auto_increment |
| title                  | varchar(120) | NO   |     | NULL    |                |
| slug                   | varchar(50)  | YES  | MUL | NULL    |                |
| content                | longtext     | YES  |     | NULL    |                |
| publish_timestamp      | datetime(6)  | YES  |     | NULL    |                |
| user_id                | int          | NO   | MUL | NULL    |                |
+------------------------+--------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

기본 구성을 작성하는 것 외에도 Django는이 MySQL 데이터베이스에서 모든 SQL 작업을 수행했습니다. 이 시점에서 Django는 그다지 인상적인 일을하지 않았습니다. 사실,이 연습의 대부분은 Django 또는 Python SQL 대체로, 그러나 추상화가 작동한다는 사실을 상기시켜줍니다.

의 부상 Python 마찰 비용

저항이 가장 적은 길과 내가 믿는 이유에 대해 이야기합시다. Python SQL을 활용하는 가장 좋은 방법 중 하나입니다.

쓰고, 읽고, 실행하고, 배송하는 것은 매우 쉽습니다. Python. 변경 "Python" 거의 모든 다른 프로그래밍 패러다임에 있으며 동일한 진술을하는 것은 거의 불가능합니다. JavaScript도 경쟁자이지만 Java와 지속적으로 혼동됩니다. 나는 이것이 일반화이며 항상 사실은 아니지만 앱을 개발할 때 발생하는 일반적인 문제라는 것을 이해합니다.

나는 이러한 일반화가 사실인 경향이 있다고 믿습니다. Python의 영어와 같은 구문으로 작업을 수행합니다.

SQL 문을 Python 그리고 장고 진술 :

  • .SQL: SELECT * from articles_blog_article;
  • Python 그리고 장고 : items = BlogArticle.objects.all()

두 문 모두 정확히 동일한 데이터를 생성합니다. 그 Python 그러나 문은 다음 목록을 반환합니다. Python 개체(items) 거의 모든 Python 다양한 경험을 가진 개발자가 사용할 수 있습니다. 원시 SQL 결과는 Python .app.

필드 설명
이 SQL 필드 설명을 자세히 살펴보면 다음과 같습니다.

+------------------------+--------------+------+-----+---------+----------------+
| Field                  | Type         | Null | Key | Default | Extra          |
+------------------------+--------------+------+-----+---------+----------------+
| title                  | varchar(120) | NO   |     | NULL    |                |
+------------------------+--------------+------+-----+---------+----------------+

이 장고 필드 설명과 비교하여 :

title = models.CharField(max_length=120)

  • 어느 것이 더 마찰이 있습니까?
  • 어느 것이 무슨 일이 일어나고 있는지 이해하기 더 쉬운가요?

어느 것이 충분한 정보를 제공합니까?

당신이 코더가 아니고 보았다면 varchar(120), 당신은 그것을 어떻게 만들 것입니까? 나는 당신이 적어도 무엇을 추측 할 수 있다고 확신합니다. max_length=120 means. 멋진 점은 정확히 같은 것을 의미한다는 것입니다.이 필드를 120 자 이하로 제한하십시오.

데이터베이스에 데이터 추가

장고와 함께 :

BlogArticle.objects.create(
    title="Hello World",
    content="Coming Soon",
    slug="hello-world",
    publish_timestamp=None,
)

SQL을 사용하면 다음과 같습니다.

INSERT INTO `articles_blog_article` (`user_id`, `title`, `slug`, `content`, `publish_timestamp`) 
VALUES (1, 'Hello World', 'hello-world', 'Coming Soon', NULL);

단순함과 명확성에 관해서는 위의 승자가 확실히 장고라고 생각합니다. Python. title = "Hello World" SQL에서 동등한 열 (필드) 값으로 무슨 일이 일어나고 있는지 알아내는 것보다 쉽습니다. 실수하지 마십시오, 이것이 SQL로 작성되는 방식은 당신이하고있는 일을 알고있을 때 매우 효과적입니다.

여러 줄 추가
장고와 함께 :

items = [
    BlogArticle(title='Hello Again 0', slug='hello-again-0', content="Coming Soon"),
    BlogArticle(title='Hello Again 1', slug='hello-again-1', content="Coming Soon"),
    BlogArticle(title='Hello Again 2', slug='hello-again-2', content="Coming Soon"),
    BlogArticle(title='Hello Again 3', slug='hello-again-3', content="Coming Soon"),
    BlogArticle(title='Hello Again 4', slug='hello-again-4', content="Coming Soon"),
]
BlogArticle.objects.bulk_create(items)

SQL을 사용하면 다음과 같습니다.

INSERT INTO `articles_blog_article` (`user_id`, `title`, `slug`, `content`, `publish_timestamp`) 
VALUES (1, 'Hello Again 0', 'hello-again-0', 'Coming Soon', NULL),
    (1, 'Hello Again 1', 'hello-again-1', 'Coming Soon', NULL),
    (1, 'Hello Again 2', 'hello-again-2', 'Coming Soon', NULL),
    (1, 'Hello Again 3', 'hello-again-3', 'Coming Soon', NULL),
    (1, 'Hello Again 4', 'hello-again-4', 'Coming Soon', NULL);

다시, Python SQL 코드는 실제 데이터에 대한 더 많은 통찰력을 제공하는 반면 코드는 더 읽기 쉽습니다. 그리고, 다시, Python 위의 장고 코드를 사용하여이 SQL 코드를 작성하고 있습니다. 꽤 깔끔하죠?

이 나란히 비교에 뛰어 든 이유는 SQL 데이터베이스를 활용하는 가장 좋은 방법을 선택하는 것이 아니라 강조 표시하기 위해서입니다.Python원시 SQL을 직접 작성하는 방법을 배우는 오버 헤드를 줄이는 데 도움이되는 능력.

몇 가지가 있습니다 Python 패키지 그들은 본질적으로 당신을 위해 원시 SQL을 작성합니다, 여기에 그들 중 몇 가지가 있습니다 :

  • Django
  • 팬더
  • SQLAlchemy
  • 극지방
  • 다스크
  • 벡스
  • Python의 내장 CSV 모듈
  • 거북이 ORM
  • 포니 오름
  • SQLObject

장고는 무거운 일을합니다
객체 관계형 매핑 패키지 (일반적으로 ORM이라고 함)는 방법에 대한 비밀 소스입니다. Python SQL 데이터베이스를 활용할 수 있습니다. ORM은 주어진 프로그래밍 언어의 기본 구문에서 데이터를 이동하는 데 도움이되는 중개자라고 생각합니다.

이 연습의 앞부분에서 우리는 이것이 Django로 어떻게 변환되는지 보기 시작했지만 이제 확장해 보겠습니다.

데이터베이스에 데이터가 있다고 가정하면 다음과 같은 명령을 작성할 수 있습니다.

my_post = BlogArticle.objects.first()
이 문은 데이터베이스를 쿼리하고 데이터를 추출하여 인스턴스에로드합니다. Python Class을 클릭한 다음 변수에 할당합니다. my_post.

여기에서 이제 다음과 같이 할 수 있습니다.

# using a django-managed python shell
# via python manage.py shell
>>> print(my_post.title)
Hello World

이 경우 점 표기법을 사용하여 title 에 선언된 필드 BlogPost 이전 섹션의 장고 모델. 이 필드는 SQL 데이터베이스 테이블의 열에 해당합니다. articles_blog_article.

ORM 덕분에 다음과 같이 할 수 있습니다.

>>> my_post.title = "some other title"

이 안에 Python 셸 세션 예제, my_post.title 지금 할 것이다 있다 "some other title". 그러나 기본 SQL 데이터베이스는 여전히 다음과 같은 동일한 데이터를 인식합니다. Hello World. 데이터베이스는 Python 마지막으로 커밋합니다 (일명 .save())이 데이터베이스로 변경됩니다. 면 Python 이 데이터를 커밋하지 않으며 데이터베이스에서 업데이트되지 않습니다. 이것은 ORM의 마법의 일부입니다. 우리는 할 수 있어요 쓰다 그리고 잔돈 실제 저장된 데이터에 영향을주지 않는 데이터. 우리가 실행하는 데이터베이스에서 실제로 일어나는 일을 변경하려는 경우 :

>>> my_post.title = "some other title again"
>>> my_post.save()

실행 후 .save() 이 특정 행에 대한 데이터베이스는 다음과 같이 작성된 것과 정확히 일치하도록 열 제목을 업데이트합니다. Python 위의 문자열입니다. 잊지 마세요 .save() 메소드는 특히 Django 모델에서 데이터베이스에 커밋하기위한 것입니다. .save() 실제로 아무 의미가 없습니다. Python Class 먼저 Django 모델 클래스 양식을 상속하지 않고.

Django, MySQL 및 Linode로 구축

이것은 Django가 당신을 위해 무거운 짐을 어떻게 수행하는지에 대한 많은 예 중 하나입니다. 관리형 MySQL 데이터베이스인 GitHub Actions for CI/CD와 함께 Linode에 Django 애플리케이션을 배포하는 최신 접근 방식에 관심이 있다면, Terraform그리고 Ansible, 지금 Linode에서 사용할 수 있는 다음 콘텐츠를 확인하십시오.

시작하는 데 도움이 되도록 기업가 코딩 GitHub 에는 시리즈의 각 단계와 함께 제공되는 코드 리포지토리가 있습니다. 행운을 빕니다, 그리고 트위터 @JustinMitchel을 통해 일이 어떻게 진행되고 있는지 알려주세요.


내용

댓글 남기기

이메일 주소는 게시되지 않습니다. 필수 필드가 표시됩니다 *