<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>All about</title>
    <link>https://light-tree.tistory.com/</link>
    <description>자취생이 쓰는 생활, 공부, 감상평</description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 19:34:58 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>빛나는나무</managingEditor>
    <image>
      <title>All about</title>
      <url>https://tistory1.daumcdn.net/tistory/1906233/attach/9a832d7e98bf401b919f6c7f67f76cee</url>
      <link>https://light-tree.tistory.com</link>
    </image>
    <item>
      <title>Pydantic - Purpose and Usage of the Field Class</title>
      <link>https://light-tree.tistory.com/302</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;The&amp;nbsp;Field&amp;nbsp;class&amp;nbsp;in&amp;nbsp;pydantic&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;define&amp;nbsp;fields&amp;nbsp;in&amp;nbsp;data&amp;nbsp;models.&amp;nbsp;This&amp;nbsp;class&amp;nbsp;allows&amp;nbsp;you&amp;nbsp;to&amp;nbsp;specify&amp;nbsp;validation&amp;nbsp;rules&amp;nbsp;for&amp;nbsp;fields&amp;nbsp;and&amp;nbsp;set&amp;nbsp;default&amp;nbsp;values,&amp;nbsp;among&amp;nbsp;other&amp;nbsp;things.&lt;br /&gt;&lt;br /&gt;Typically, the Field class is used within data model classes in pydantic. For example,&lt;/p&gt;
&lt;pre id=&quot;code_1711342596040&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pydantic import BaseModel, Field

class User(BaseModel):
    id: int
    username: str = Field(..., min_length=4, max_length=20)
    email: str = Field(..., regex=r&quot;^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$&quot;)
    age: int = Field(..., ge=0, le=130)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In&amp;nbsp;the&amp;nbsp;above&amp;nbsp;code,&amp;nbsp;the&amp;nbsp;User&amp;nbsp;class&amp;nbsp;inherits&amp;nbsp;from&amp;nbsp;BaseModel,&amp;nbsp;and&amp;nbsp;each&amp;nbsp;field&amp;nbsp;is&amp;nbsp;defined&amp;nbsp;with&amp;nbsp;its&amp;nbsp;corresponding&amp;nbsp;data&amp;nbsp;type.&amp;nbsp;The&amp;nbsp;Field&amp;nbsp;class&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;set&amp;nbsp;additional&amp;nbsp;validation&amp;nbsp;rules.&amp;nbsp;For&amp;nbsp;instance,&amp;nbsp;the&amp;nbsp;username&amp;nbsp;field&amp;nbsp;has&amp;nbsp;minimum&amp;nbsp;and&amp;nbsp;maximum&amp;nbsp;length&amp;nbsp;constraints,&amp;nbsp;the&amp;nbsp;email&amp;nbsp;field&amp;nbsp;has&amp;nbsp;a&amp;nbsp;regular&amp;nbsp;expression&amp;nbsp;pattern&amp;nbsp;to&amp;nbsp;validate&amp;nbsp;email&amp;nbsp;format,&amp;nbsp;and&amp;nbsp;the&amp;nbsp;age&amp;nbsp;field&amp;nbsp;has&amp;nbsp;minimum&amp;nbsp;and&amp;nbsp;maximum&amp;nbsp;value&amp;nbsp;constraints&amp;nbsp;to&amp;nbsp;specify&amp;nbsp;a&amp;nbsp;valid&amp;nbsp;age&amp;nbsp;range.&lt;br /&gt;&lt;br /&gt;Additionally,&amp;nbsp;the&amp;nbsp;Field&amp;nbsp;class&amp;nbsp;can&amp;nbsp;be&amp;nbsp;used&amp;nbsp;to&amp;nbsp;set&amp;nbsp;descriptions,&amp;nbsp;default&amp;nbsp;values,&amp;nbsp;and&amp;nbsp;other&amp;nbsp;options&amp;nbsp;for&amp;nbsp;fields.&amp;nbsp;This&amp;nbsp;provides&amp;nbsp;additional&amp;nbsp;information&amp;nbsp;for&amp;nbsp;each&amp;nbsp;field&amp;nbsp;in&amp;nbsp;the&amp;nbsp;data&amp;nbsp;model,&amp;nbsp;making&amp;nbsp;documentation&amp;nbsp;generation&amp;nbsp;and&amp;nbsp;understanding&amp;nbsp;easier.&lt;/p&gt;</description>
      <category>공부/Python</category>
      <category>Data modeling in Python</category>
      <category>Data validation with Pydantic</category>
      <category>Pydantic data modeling</category>
      <category>Pydantic field class</category>
      <category>Pydantic field validation</category>
      <category>Pydantic library</category>
      <category>Python data validation</category>
      <category>Python data validation rules</category>
      <category>Python data validation techniques</category>
      <category>Python schema validation</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/302</guid>
      <comments>https://light-tree.tistory.com/302#entry302comment</comments>
      <pubDate>Tue, 26 Mar 2024 23:59:11 +0900</pubDate>
    </item>
    <item>
      <title>Pydantic - Field 클래스의 용도와 사용법</title>
      <link>https://light-tree.tistory.com/301</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pydantic은&amp;nbsp;Python의&amp;nbsp;데이터&amp;nbsp;유효성&amp;nbsp;검사&amp;nbsp;및&amp;nbsp;설정을&amp;nbsp;위한&amp;nbsp;유용한&amp;nbsp;라이브러리입니다.&amp;nbsp;이&amp;nbsp;라이브러리는&amp;nbsp;데이터&amp;nbsp;클래스&amp;nbsp;및&amp;nbsp;데이터&amp;nbsp;유효성&amp;nbsp;검사에&amp;nbsp;대한&amp;nbsp;간결한&amp;nbsp;구문을&amp;nbsp;제공하여&amp;nbsp;코드의&amp;nbsp;가독성과&amp;nbsp;유지&amp;nbsp;보수성을&amp;nbsp;향상시킵니다.&lt;br /&gt;&lt;br /&gt;pydantic의&amp;nbsp;Field&amp;nbsp;클래스는&amp;nbsp;데이터&amp;nbsp;모델의&amp;nbsp;필드를&amp;nbsp;정의하는&amp;nbsp;데&amp;nbsp;사용됩니다.&amp;nbsp;이&amp;nbsp;클래스를&amp;nbsp;사용하면&amp;nbsp;필드에&amp;nbsp;대한&amp;nbsp;유효성&amp;nbsp;검사&amp;nbsp;규칙을&amp;nbsp;정의할&amp;nbsp;수&amp;nbsp;있으며,&amp;nbsp;데이터&amp;nbsp;유효성&amp;nbsp;검사를&amp;nbsp;수행하거나&amp;nbsp;필드의&amp;nbsp;기본값을&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;일반적으로 Field 클래스는 pydantic의 데이터 모델 클래스 안에서 사용됩니다. 예를 들어, 다음은 Field 클래스를 사용하여 데이터 모델의 필드를 정의하는 예입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1711342350186&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from pydantic import BaseModel, Field

class User(BaseModel):
    id: int
    username: str = Field(..., min_length=4, max_length=20)
    email: str = Field(..., regex=r&quot;^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$&quot;)
    age: int = Field(..., ge=0, le=130)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의&amp;nbsp;코드에서&amp;nbsp;User&amp;nbsp;클래스는&amp;nbsp;Pydantic의&amp;nbsp;BaseModel을&amp;nbsp;상속받았으며,&amp;nbsp;각&amp;nbsp;필드는&amp;nbsp;해당하는&amp;nbsp;데이터&amp;nbsp;타입으로&amp;nbsp;정의됩니다.&amp;nbsp;Field&amp;nbsp;클래스를&amp;nbsp;사용하여&amp;nbsp;추가적인&amp;nbsp;유효성&amp;nbsp;검사&amp;nbsp;규칙을&amp;nbsp;설정할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;위의&amp;nbsp;예제에서는&amp;nbsp;username&amp;nbsp;필드에는&amp;nbsp;최소&amp;nbsp;길이와&amp;nbsp;최대&amp;nbsp;길이를&amp;nbsp;설정하고,&amp;nbsp;email&amp;nbsp;필드에는&amp;nbsp;정규&amp;nbsp;표현식을&amp;nbsp;사용하여&amp;nbsp;이메일&amp;nbsp;형식의&amp;nbsp;유효성을&amp;nbsp;검사하고&amp;nbsp;있습니다.&amp;nbsp;age&amp;nbsp;필드에는&amp;nbsp;최소값과&amp;nbsp;최대값을&amp;nbsp;설정하여&amp;nbsp;유효한&amp;nbsp;나이&amp;nbsp;범위를&amp;nbsp;지정하고&amp;nbsp;있습니다.&lt;br /&gt;또한,&amp;nbsp;Field&amp;nbsp;클래스를&amp;nbsp;사용하여&amp;nbsp;필드에&amp;nbsp;대한&amp;nbsp;설명,&amp;nbsp;기본값&amp;nbsp;및&amp;nbsp;다른&amp;nbsp;옵션을&amp;nbsp;설정할&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;이는&amp;nbsp;데이터&amp;nbsp;모델의&amp;nbsp;각&amp;nbsp;필드에&amp;nbsp;대한&amp;nbsp;추가&amp;nbsp;정보를&amp;nbsp;제공하고,&amp;nbsp;문서&amp;nbsp;생성&amp;nbsp;및&amp;nbsp;이해를&amp;nbsp;쉽게&amp;nbsp;만들어줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/Python</category>
      <category>Pydantic Field 클래스</category>
      <category>Pydantic 데이터 유효성 검사 예제</category>
      <category>Pydantic 라이브러리</category>
      <category>Pydantic 사용법</category>
      <category>Python 데이터 모델 유효성 검사 방법</category>
      <category>Python 데이터 모델링</category>
      <category>Python 데이터 유효성 검사</category>
      <category>Python 데이터 유효성 검증 라이브러리</category>
      <category>데이터 모델 필드 정의</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/301</guid>
      <comments>https://light-tree.tistory.com/301#entry301comment</comments>
      <pubDate>Mon, 25 Mar 2024 23:54:50 +0900</pubDate>
    </item>
    <item>
      <title>linux inode란, inode가 부족한 경우</title>
      <link>https://light-tree.tistory.com/300</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;inode는 리눅스와 유닉스 계열 운영 체제에서 파일 시스템에서 사용되는 중요한 개념입니다. index node의 줄임말로, 파일 시스템에서 파일이나 디렉토리의 메타데이터를 저장하는 데 사용됩니다.&lt;br /&gt;일반적으로 각 파일이나 디렉토리는 고유한 inode를 가집니다. 이 inode는 해당 파일이나 디렉토리의 메타데이터를 저장하는 데 사용됩니다. 이 메타데이터에는 파일의 소유자, 그룹, 권한, 크기, 생성 시간, 수정 시간, 마지막 접근 시간 등의 정보가 포함됩니다. 또한 파일 시스템 내에서 파일이나 디렉토리의 실제 데이터 블록에 대한 참조도 inode에 저장됩니다.&lt;br /&gt;inode는 파일 이름과는 별도로 관리되며 파일이나 디렉토리의 이름은 해당 inode에 대한 포인터로 연결됩니다. 이를 통해 파일 시스템은 inode를 통해 파일의 메타데이터를 효율적으로 관리하고 동일한 파일에 대한 여러 개의 하드 링크를 지원할 수 있습니다.&lt;br /&gt;따라서 inode는 파일 시스템의 핵심 요소이며 파일이나 디렉토리의 메타데이터와 데이터에 대한 참조를 저장하여 파일 시스템의 구조를 지원합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inode가 부족한 경우 디스크에 용량이 충분하더라도 새로운 파일을 생성할 수 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inode를 확인하는 방법은 운영 체제와 사용하는 파일 시스템에 따라 다를 수 있습니다. 보통은 cli 인터페이스를 사용하여 inode를 확인할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linux 및 대부분의 Unix 시스템&lt;/b&gt;&lt;br /&gt;ls -i 명령을 사용하여 현재 디렉토리의 파일과 디렉토리의 inode를 확인할 수 있습니다. 예를 들어 ls -i filename은 특정 파일의 inode를 확인합니다. stat 명령을 사용하여 파일의 상세한 정보를 확인할 수 있으며 여기에는 inode 번호도 포함됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;macOS (또는 macOS에서 Terminal을 통해 사용하는 Unix 명령)&lt;/b&gt;&lt;br /&gt;macOS의 경우 Unix 명령을 사용할 수 있으며 Linux와 유사한 방법으로 ls -i 또는 stat 명령을 사용하여 inode를 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Windows Subsystem for Linux (WSL)&lt;/b&gt;&lt;br /&gt;WSL을 사용하는 경우 Linux 명령을 사용하여 inode를 확인할 수 있습니다. 일반적으로 Linux와 동일한 방법으로 ls -i 또는 stat 명령을 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위의 명령은 cli에서 사용됩니다. 일반적으로 특정 파일이나 디렉토리의 inode를 확인하는 것이 목적입니다. 파일 시스템이나 운영 체제에 따라 다른 옵션이나 도구를 사용할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ls -i 명령어 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710826199278&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ls -i myfile.txt
123456 myfile.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;stat 명령어 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710826349519&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ stat myfile.txt
  File: myfile.txt
  Size: 2285            Blocks: 8          IO Block: 4096   regular file
Device: 10301h/66305d   Inode: 259102      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  ubuntu)   Gid: ( 1000/  ubuntu)
Access: 2023-10-30 08:06:44.426663873 +0000
Modify: 2023-07-26 09:16:49.908834162 +0000
Change: 2023-07-26 09:16:49.908834162 +0000
 Birth: 2023-07-26 09:16:49.908834162 +0000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;df 명령어 사용&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710826385729&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ df -i
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda1      655360 40000 615360    7% /&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;명령은&amp;nbsp;파일&amp;nbsp;시스템의&amp;nbsp;inode&amp;nbsp;사용량과&amp;nbsp;관련된&amp;nbsp;정보를&amp;nbsp;제공합니다.&amp;nbsp;위의&amp;nbsp;예시에서는&amp;nbsp;파일&amp;nbsp;시스템&amp;nbsp;&amp;ldquo;/dev/sda1&amp;rdquo;에&amp;nbsp;총&amp;nbsp;655,360개의&amp;nbsp;inode&amp;nbsp;중&amp;nbsp;40,000개가&amp;nbsp;사용되었음을&amp;nbsp;나타냅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;inode가 부족한 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inode 부족 문제는 파일 시스템에 더 이상 새로운 파일을 만들 수 없는 상황을 초래할 수 있습니다. 이런 경우 아래의 방법들을 시도해볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;더 많은 inode을 포함하는 파일 시스템 사용&lt;/b&gt;&lt;br /&gt;일부&amp;nbsp;파일&amp;nbsp;시스템은&amp;nbsp;기본적으로&amp;nbsp;많은&amp;nbsp;수의&amp;nbsp;inode을&amp;nbsp;지원합니다.&amp;nbsp;예를&amp;nbsp;들어&amp;nbsp;ext4&amp;nbsp;파일&amp;nbsp;시스템은&amp;nbsp;기본적으로&amp;nbsp;많은&amp;nbsp;수의&amp;nbsp;inode을&amp;nbsp;제공합니다.&amp;nbsp;새&amp;nbsp;파일&amp;nbsp;시스템을&amp;nbsp;생성하여&amp;nbsp;inode이&amp;nbsp;부족한&amp;nbsp;문제를&amp;nbsp;해결할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 시스템을 재구성&lt;/b&gt;&lt;br /&gt;파일 시스템을 백업한 후 새로운 파일 시스템으로 포맷하고 데이터를 복원할 수 있습니다. 이는 파일 시스템의 inode 크기를 늘리는 데 도움이 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;더 큰 inode 크기를 사용&lt;/b&gt;&lt;br /&gt;몇몇 파일 시스템은 inode의 크기를 조정할 수 있습니다. inode 크기를 늘리면 더 많은 inode을 가질 수 있습니다. 그러나 이 방법은 파일 시스템을 포맷해야 할 수도 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용하지 않는 파일 정리&lt;/b&gt;&lt;br /&gt;사용하지 않는 파일이나 디렉토리를 정리하여 inode을 확보할 수 있습니다. 크기가 큰 또는 중요하지 않은 파일을 삭제하고 더 이상 필요하지 않은 디렉토리를 정리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;하드 링크 대신 심볼릭 링크 사용&lt;/b&gt;&lt;br /&gt;하드&amp;nbsp;링크는&amp;nbsp;하나의&amp;nbsp;파일에&amp;nbsp;대해&amp;nbsp;여러&amp;nbsp;개의&amp;nbsp;inode을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;대신&amp;nbsp;심볼릭&amp;nbsp;링크를&amp;nbsp;사용하여&amp;nbsp;하나의&amp;nbsp;inode만을&amp;nbsp;사용하도록&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;inode을 절약하는 파일 시스템 사용&lt;/b&gt;&lt;br /&gt;몇몇 파일 시스템은 파일을 저장하는 방식을 조정하여 inode을 더 효율적으로 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 방법 중 일부는 파일 시스템을 재구성하거나 조정해야 하므로 주의가 필요합니다. 따라서 적절한 백업이나 데이터 안정성을 고려해야 합니다.&lt;/p&gt;</description>
      <category>공부/TIL(을 빙자한 기타)</category>
      <category>Inode 부족</category>
      <category>Unix</category>
      <category>데이터 관리</category>
      <category>디스크 관리</category>
      <category>리눅스</category>
      <category>메타데이터</category>
      <category>시스템 관리</category>
      <category>파일 관리</category>
      <category>파일 시스템</category>
      <category>하드 드라이브</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/300</guid>
      <comments>https://light-tree.tistory.com/300#entry300comment</comments>
      <pubDate>Wed, 20 Mar 2024 22:07:10 +0900</pubDate>
    </item>
    <item>
      <title>Inodes: What They Are, How to Manage Them, and Solutions for Shortages</title>
      <link>https://light-tree.tistory.com/299</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;An &quot;inode&quot; is a crucial concept used in Linux and Unix-like operating systems within the file system. Short for &quot;index node&quot;, it is utilized to store metadata for files and directories.&lt;br /&gt;&lt;br /&gt;Typically,&amp;nbsp;each&amp;nbsp;file&amp;nbsp;or&amp;nbsp;directory&amp;nbsp;has&amp;nbsp;a&amp;nbsp;unique&amp;nbsp;inode&amp;nbsp;associated&amp;nbsp;with&amp;nbsp;it.&amp;nbsp;This&amp;nbsp;inode&amp;nbsp;is&amp;nbsp;used&amp;nbsp;to&amp;nbsp;store&amp;nbsp;metadata&amp;nbsp;for&amp;nbsp;the&amp;nbsp;respective&amp;nbsp;file&amp;nbsp;or&amp;nbsp;directory,&amp;nbsp;including&amp;nbsp;information&amp;nbsp;such&amp;nbsp;as&amp;nbsp;the&amp;nbsp;owner,&amp;nbsp;group,&amp;nbsp;permissions,&amp;nbsp;size,&amp;nbsp;creation&amp;nbsp;time,&amp;nbsp;modification&amp;nbsp;time,&amp;nbsp;last&amp;nbsp;access&amp;nbsp;time,&amp;nbsp;and&amp;nbsp;more.&amp;nbsp;Additionally,&amp;nbsp;references&amp;nbsp;to&amp;nbsp;the&amp;nbsp;actual&amp;nbsp;data&amp;nbsp;blocks&amp;nbsp;of&amp;nbsp;files&amp;nbsp;or&amp;nbsp;directories&amp;nbsp;within&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system&amp;nbsp;are&amp;nbsp;stored&amp;nbsp;in&amp;nbsp;the&amp;nbsp;inode.&lt;br /&gt;&lt;br /&gt;Inodes&amp;nbsp;are&amp;nbsp;managed&amp;nbsp;separately&amp;nbsp;from&amp;nbsp;file&amp;nbsp;names,&amp;nbsp;and&amp;nbsp;the&amp;nbsp;names&amp;nbsp;of&amp;nbsp;files&amp;nbsp;or&amp;nbsp;directories&amp;nbsp;are&amp;nbsp;linked&amp;nbsp;to&amp;nbsp;their&amp;nbsp;respective&amp;nbsp;inodes&amp;nbsp;through&amp;nbsp;pointers.&amp;nbsp;This&amp;nbsp;allows&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system&amp;nbsp;to&amp;nbsp;efficiently&amp;nbsp;manage&amp;nbsp;file&amp;nbsp;metadata&amp;nbsp;using&amp;nbsp;inodes&amp;nbsp;and&amp;nbsp;support&amp;nbsp;multiple&amp;nbsp;hard&amp;nbsp;links&amp;nbsp;to&amp;nbsp;the&amp;nbsp;same&amp;nbsp;file.&lt;br /&gt;&lt;br /&gt;Therefore,&amp;nbsp;inodes&amp;nbsp;serve&amp;nbsp;as&amp;nbsp;a&amp;nbsp;core&amp;nbsp;component&amp;nbsp;of&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system,&amp;nbsp;storing&amp;nbsp;metadata&amp;nbsp;for&amp;nbsp;files&amp;nbsp;and&amp;nbsp;directories,&amp;nbsp;as&amp;nbsp;well&amp;nbsp;as&amp;nbsp;references&amp;nbsp;to&amp;nbsp;their&amp;nbsp;data,&amp;nbsp;thereby&amp;nbsp;supporting&amp;nbsp;the&amp;nbsp;structure&amp;nbsp;of&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000; text-align: start;&quot;&gt;If the inode is insufficient, you cannot create new files even if the disk has enough space.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Checking&amp;nbsp;inodes&amp;nbsp;can&amp;nbsp;vary&amp;nbsp;depending&amp;nbsp;on&amp;nbsp;the&amp;nbsp;operating&amp;nbsp;system&amp;nbsp;and&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system&amp;nbsp;being&amp;nbsp;used.&amp;nbsp;Typically,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;use&amp;nbsp;command-line&amp;nbsp;interfaces&amp;nbsp;to&amp;nbsp;check&amp;nbsp;inodes.&amp;nbsp;Here&amp;nbsp;are&amp;nbsp;general&amp;nbsp;methods&amp;nbsp;for&amp;nbsp;major&amp;nbsp;operating&amp;nbsp;systems&amp;nbsp;and&amp;nbsp;file&amp;nbsp;systems:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Linux and Most Unix Systems&lt;/b&gt;&lt;br /&gt;Use&amp;nbsp;the&amp;nbsp;ls&amp;nbsp;-i&amp;nbsp;command&amp;nbsp;to&amp;nbsp;check&amp;nbsp;the&amp;nbsp;inodes&amp;nbsp;of&amp;nbsp;files&amp;nbsp;and&amp;nbsp;directories&amp;nbsp;in&amp;nbsp;the&amp;nbsp;current&amp;nbsp;directory.&amp;nbsp;For&amp;nbsp;example,&amp;nbsp;ls&amp;nbsp;-i&amp;nbsp;filename&amp;nbsp;checks&amp;nbsp;the&amp;nbsp;inode&amp;nbsp;of&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;file.&lt;br /&gt;Use&amp;nbsp;the&amp;nbsp;stat&amp;nbsp;command&amp;nbsp;to&amp;nbsp;get&amp;nbsp;detailed&amp;nbsp;information&amp;nbsp;about&amp;nbsp;a&amp;nbsp;file,&amp;nbsp;which&amp;nbsp;includes&amp;nbsp;the&amp;nbsp;inode&amp;nbsp;number.&amp;nbsp;For&amp;nbsp;example:&amp;nbsp;stat&amp;nbsp;filename.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;macOS (or Unix commands via Terminal on macOS)&lt;/b&gt;&lt;br /&gt;On&amp;nbsp;macOS,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;use&amp;nbsp;Unix&amp;nbsp;commands&amp;nbsp;similarly&amp;nbsp;to&amp;nbsp;Linux.&amp;nbsp;Use&amp;nbsp;ls&amp;nbsp;-i&amp;nbsp;or&amp;nbsp;stat&amp;nbsp;commands&amp;nbsp;to&amp;nbsp;check&amp;nbsp;inodes.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Windows Subsystem for Linux (WSL)&lt;/b&gt;&lt;br /&gt;If&amp;nbsp;you're&amp;nbsp;using&amp;nbsp;WSL,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;use&amp;nbsp;Linux&amp;nbsp;commands&amp;nbsp;to&amp;nbsp;check&amp;nbsp;inodes.&amp;nbsp;Typically,&amp;nbsp;you'd&amp;nbsp;use&amp;nbsp;ls&amp;nbsp;-i&amp;nbsp;or&amp;nbsp;stat&amp;nbsp;commands&amp;nbsp;in&amp;nbsp;a&amp;nbsp;similar&amp;nbsp;fashion&amp;nbsp;as&amp;nbsp;in&amp;nbsp;Linux.&lt;br /&gt;These&amp;nbsp;commands&amp;nbsp;are&amp;nbsp;used&amp;nbsp;in&amp;nbsp;the&amp;nbsp;command&amp;nbsp;line,&amp;nbsp;usually&amp;nbsp;to&amp;nbsp;check&amp;nbsp;the&amp;nbsp;inode&amp;nbsp;of&amp;nbsp;a&amp;nbsp;specific&amp;nbsp;file&amp;nbsp;or&amp;nbsp;directory.&amp;nbsp;Other&amp;nbsp;options&amp;nbsp;or&amp;nbsp;tools&amp;nbsp;might&amp;nbsp;be&amp;nbsp;available&amp;nbsp;depending&amp;nbsp;on&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system&amp;nbsp;or&amp;nbsp;operating&amp;nbsp;system.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Using the ls -i command&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710826611636&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ ls -i myfile.txt
123456 myfile.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Using the stat command&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710826652299&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ stat myfile.txt
  File: myfile.txt
  Size: 2285            Blocks: 8          IO Block: 4096   regular file
Device: 10301h/66305d   Inode: 259102      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/  ubuntu)   Gid: ( 1000/  ubuntu)
Access: 2023-10-30 08:06:44.426663873 +0000
Modify: 2023-07-26 09:16:49.908834162 +0000
Change: 2023-07-26 09:16:49.908834162 +0000
 Birth: 2023-07-26 09:16:49.908834162 +0000&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Using the df command&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1710826682651&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ df -i
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/sda1      655360 40000 615360    7% /&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This&amp;nbsp;command&amp;nbsp;provides&amp;nbsp;information&amp;nbsp;regarding&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system's&amp;nbsp;inode&amp;nbsp;usage.&amp;nbsp;The&amp;nbsp;above&amp;nbsp;example&amp;nbsp;shows&amp;nbsp;that&amp;nbsp;40,000&amp;nbsp;out&amp;nbsp;of&amp;nbsp;a&amp;nbsp;total&amp;nbsp;of&amp;nbsp;655,360&amp;nbsp;inodes&amp;nbsp;were&amp;nbsp;used&amp;nbsp;in&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system&amp;nbsp;&quot;/dev/sda1&quot;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #fdfdfd; color: #000000; text-align: start;&quot;&gt;In case of insufficient inode&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here are some ways to address an inode shortage issue.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Use a file system with more inodes&lt;/b&gt;&lt;br /&gt;Some&amp;nbsp;file&amp;nbsp;systems&amp;nbsp;inherently&amp;nbsp;support&amp;nbsp;a&amp;nbsp;larger&amp;nbsp;number&amp;nbsp;of&amp;nbsp;inodes.&amp;nbsp;For&amp;nbsp;instance,&amp;nbsp;the&amp;nbsp;ext4&amp;nbsp;file&amp;nbsp;system&amp;nbsp;typically&amp;nbsp;provides&amp;nbsp;a&amp;nbsp;large&amp;nbsp;number&amp;nbsp;of&amp;nbsp;inodes&amp;nbsp;by&amp;nbsp;default.&amp;nbsp;Creating&amp;nbsp;a&amp;nbsp;new&amp;nbsp;file&amp;nbsp;system&amp;nbsp;with&amp;nbsp;ample&amp;nbsp;inodes&amp;nbsp;can&amp;nbsp;resolve&amp;nbsp;the&amp;nbsp;inode&amp;nbsp;shortage&amp;nbsp;problem.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;Reformat the file system&lt;/b&gt;&lt;br /&gt;Back&amp;nbsp;up&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system,&amp;nbsp;reformat&amp;nbsp;it&amp;nbsp;with&amp;nbsp;a&amp;nbsp;new&amp;nbsp;file&amp;nbsp;system,&amp;nbsp;and&amp;nbsp;restore&amp;nbsp;the&amp;nbsp;data.&amp;nbsp;This&amp;nbsp;can&amp;nbsp;help&amp;nbsp;increase&amp;nbsp;the&amp;nbsp;size&amp;nbsp;of&amp;nbsp;inodes&amp;nbsp;within&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Increase inode size&lt;/b&gt;&lt;br /&gt;Some&amp;nbsp;file&amp;nbsp;systems&amp;nbsp;allow&amp;nbsp;for&amp;nbsp;adjusting&amp;nbsp;the&amp;nbsp;size&amp;nbsp;of&amp;nbsp;inodes.&amp;nbsp;Increasing&amp;nbsp;the&amp;nbsp;inode&amp;nbsp;size&amp;nbsp;can&amp;nbsp;allow&amp;nbsp;for&amp;nbsp;more&amp;nbsp;inodes.&amp;nbsp;However,&amp;nbsp;such&amp;nbsp;measures&amp;nbsp;might&amp;nbsp;require&amp;nbsp;reformatting&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Clean up unused files&lt;/b&gt;&lt;br /&gt;Clear&amp;nbsp;out&amp;nbsp;unused&amp;nbsp;files&amp;nbsp;or&amp;nbsp;directories&amp;nbsp;to&amp;nbsp;free&amp;nbsp;up&amp;nbsp;inodes.&amp;nbsp;Delete&amp;nbsp;large&amp;nbsp;or&amp;nbsp;unimportant&amp;nbsp;files&amp;nbsp;and&amp;nbsp;tidy&amp;nbsp;up&amp;nbsp;directories&amp;nbsp;that&amp;nbsp;are&amp;nbsp;no&amp;nbsp;longer&amp;nbsp;needed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Use symbolic links instead of hard links&lt;/b&gt;&lt;br /&gt;Hard&amp;nbsp;links&amp;nbsp;can&amp;nbsp;consume&amp;nbsp;multiple&amp;nbsp;inodes&amp;nbsp;for&amp;nbsp;a&amp;nbsp;single&amp;nbsp;file.&amp;nbsp;Instead,&amp;nbsp;use&amp;nbsp;symbolic&amp;nbsp;links&amp;nbsp;to&amp;nbsp;ensure&amp;nbsp;only&amp;nbsp;one&amp;nbsp;inode&amp;nbsp;is&amp;nbsp;used.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Use file systems that conserve inodes&lt;/b&gt;&lt;br /&gt;Some&amp;nbsp;file&amp;nbsp;systems&amp;nbsp;adjust&amp;nbsp;how&amp;nbsp;files&amp;nbsp;are&amp;nbsp;stored&amp;nbsp;to&amp;nbsp;use&amp;nbsp;inodes&amp;nbsp;more&amp;nbsp;efficiently.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Some&amp;nbsp;of&amp;nbsp;these&amp;nbsp;methods&amp;nbsp;may&amp;nbsp;involve&amp;nbsp;restructuring&amp;nbsp;or&amp;nbsp;adjusting&amp;nbsp;the&amp;nbsp;file&amp;nbsp;system,&amp;nbsp;so&amp;nbsp;caution&amp;nbsp;is&amp;nbsp;advised.&amp;nbsp;Proper&amp;nbsp;backups&amp;nbsp;and&amp;nbsp;consideration&amp;nbsp;of&amp;nbsp;data&amp;nbsp;integrity&amp;nbsp;are&amp;nbsp;essential.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/TIL(을 빙자한 기타)</category>
      <category>Data Management</category>
      <category>Disk Management</category>
      <category>File Management</category>
      <category>file system</category>
      <category>hard drive</category>
      <category>Inode Shortage</category>
      <category>Linux</category>
      <category>metadata</category>
      <category>System Administration</category>
      <category>Unix</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/299</guid>
      <comments>https://light-tree.tistory.com/299#entry299comment</comments>
      <pubDate>Tue, 19 Mar 2024 22:02:16 +0900</pubDate>
    </item>
    <item>
      <title>Sorting Lists, Tuples, Strings, and Dictionaries Using Python's sorted Function</title>
      <link>https://light-tree.tistory.com/298</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;The &lt;b&gt;sorted&lt;/b&gt; function is used in Python to sort iterable objects such as lists, tuples, and strings. This function returns a new sorted list without modifying the original data. The basic syntax of the sorted function is as follows&lt;/p&gt;
&lt;pre id=&quot;code_1705846592856&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sorted(iterable, key=None, reverse=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;iterable&lt;/b&gt;: Represents the iterable object to be sorted (e.g., a list, tuple, or string).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;key&lt;/b&gt; (optional): A function that provides the sorting criterion. The default is None, in which case the elements are sorted based on their own values.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;reverse&lt;/b&gt; (optional): The default is False, and if set to True, the sorting is done in descending order.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here's a simple example to illustrate the usage of the sorted function.&lt;/p&gt;
&lt;pre id=&quot;code_1705846625591&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Sorting a list of numbers
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # Output: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

# Sorting a string
text = &quot;python&quot;
sorted_text = sorted(text)
print(sorted_text)  # Output: ['h', 'n', 'o', 'p', 't', 'y']

# Sorting in descending order
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc)  # Output: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;You can also use the key parameter to specify a custom sorting criterion. In this case, provide a function that returns the value to be used for sorting. For example, sorting based on the absolute values.&lt;/p&gt;
&lt;pre id=&quot;code_1705846652441&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numbers = [-5, 3, -1, 8, -2, 7]
sorted_numbers_abs = sorted(numbers, key=abs)
print(sorted_numbers_abs)  # Output: [-1, -2, 3, -5, 7, 8]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For dictionary,&lt;/p&gt;
&lt;pre id=&quot;code_1705847048676&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# Sorting a dictionary by its keys
my_dict = {'apple': 3, 'banana': 1, 'orange': 5, 'grape': 2}
sorted_dict_keys = dict(sorted(my_dict.items()))
print(sorted_dict_keys)
# Output: {'apple': 3, 'banana': 1, 'grape': 2, 'orange': 5}

# Sorting a dictionary by its values
sorted_dict_values = dict(sorted(my_dict.items(), key=lambda item: item[1]))
print(sorted_dict_values)
# Output: {'banana': 1, 'grape': 2, 'apple': 3, 'orange': 5}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In the first example, the dictionary is &lt;b&gt;sorted&lt;/b&gt; based on its keys using the sorted function. In the second example, it is sorted based on the values using the &lt;b&gt;key&lt;/b&gt; parameter with a lambda function.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For object attrubute,&lt;/p&gt;
&lt;pre id=&quot;code_1705847080440&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# Creating a list of Person objects
people = [Person('Alice', 30), Person('Bob', 25), Person('Charlie', 35)]

# Sorting the list of objects based on the 'age' attribute
sorted_people = sorted(people, key=lambda person: person.age)
for person in sorted_people:
    print(f&quot;{person.name}: {person.age} years old&quot;)
# Output:
# Bob: 25 years old
# Alice: 30 years old
# Charlie: 35 years old&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this example, the &lt;b&gt;sorted&lt;/b&gt; function is used to sort a list of Person objects based on the &lt;b&gt;'age'&lt;/b&gt; attribute. The &lt;b&gt;key&lt;/b&gt; parameter is utilized with a lambda function that extracts the &lt;b&gt;'age'&lt;/b&gt; attribute for comparison.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Here's an example of a list containing dictionaries&lt;/p&gt;
&lt;pre id=&quot;code_1705847373401&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# List with dictionaries
people_list = [
    {'name': 'Alice', 'age': 30, 'city': 'New York'},
    {'name': 'Bob', 'age': 25, 'city': 'San Francisco'},
    {'name': 'Charlie', 'age': 35, 'city': 'Los Angeles'}
]

# Sorting dictionaries based on 'age'
sorted_people = sorted(people_list, key=lambda person: person['age'])
for person in sorted_people:
    print(f&quot;Name: {person['name']}, Age: {person['age']}, City: {person['city']}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this way, the sorted function can be used to sort various types of data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ref. &lt;a href=&quot;https://docs.python.org/3/howto/sorting.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.python.org/3/howto/sorting.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>공부/Python</category>
      <category>Python</category>
      <category>python dict 정렬</category>
      <category>python sorted</category>
      <category>python sorted 정렬</category>
      <category>python 정렬</category>
      <category>파이썬 딕셔너리 정렬</category>
      <category>파이썬 정렬</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/298</guid>
      <comments>https://light-tree.tistory.com/298#entry298comment</comments>
      <pubDate>Tue, 23 Jan 2024 23:31:11 +0900</pubDate>
    </item>
    <item>
      <title>python sorted 함수를 통한 리스트, 튜플, 문자열, 딕셔너리 정렬</title>
      <link>https://light-tree.tistory.com/297</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;sorted &lt;/span&gt;&lt;/b&gt;함수는&lt;span&gt; &lt;/span&gt;파이썬에서&lt;span&gt; &lt;/span&gt;리스트&lt;span&gt;, &lt;/span&gt;튜플&lt;span&gt;, &lt;/span&gt;문자열, 딕셔너리&lt;span&gt; &lt;/span&gt;등의&lt;span&gt; iterable &lt;/span&gt;객체를&lt;span&gt; &lt;/span&gt;정렬하는&lt;span&gt; &lt;/span&gt;데&lt;span&gt; &lt;/span&gt;사용됩니다&lt;span&gt;. &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;함수는&lt;span&gt; &lt;/span&gt;정렬된&lt;span&gt; &lt;/span&gt;새로운&lt;span&gt; &lt;/span&gt;리스트를&lt;span&gt; &lt;/span&gt;반환하며&lt;span&gt;, &lt;/span&gt;원본&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;변경하지&lt;span&gt; &lt;/span&gt;않습니다&lt;span&gt;. sorted &lt;/span&gt;함수의&lt;span&gt; &lt;/span&gt;기본&lt;span&gt; &lt;/span&gt;사용법은&lt;span&gt; &lt;/span&gt;다음과&lt;span&gt; &lt;/span&gt;같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1705846397356&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sorted(iterable, key=None, reverse=False)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;iterable&lt;/b&gt;: 정렬하려는 iterable 객체를 나타냅니다 (리스트, 튜플, 문자열, 딕셔너리 등).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;key&lt;/b&gt; (선택적): 정렬 기준을 제공하는 함수입니다. 기본값은 None이며, 이 경우에는 요소 자체의 값을 기준으로 정렬됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;reverse&lt;/b&gt; (선택적): 기본값은 False이며, True로 설정하면 내림차순으로 정렬됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은&lt;span&gt; &lt;/span&gt;간단한&lt;span&gt; &lt;/span&gt;예제를&lt;span&gt; &lt;/span&gt;통해&lt;span&gt; sorted &lt;/span&gt;함수의&lt;span&gt; &lt;/span&gt;사용법을&lt;span&gt; &lt;/span&gt;보여줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1705846446808&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 숫자 리스트를 정렬
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = sorted(numbers)
print(sorted_numbers)  # 출력: [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

# 문자열을 정렬
text = &quot;python&quot;
sorted_text = sorted(text)
print(sorted_text)  # 출력: ['h', 'n', 'o', 'p', 't', 'y']

# 내림차순으로 정렬
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc)  # 출력: [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;key &lt;/span&gt;매개변수를&lt;span&gt; &lt;/span&gt;사용하여&lt;span&gt; &lt;/span&gt;정렬&lt;span&gt; &lt;/span&gt;기준을&lt;span&gt; &lt;/span&gt;지정할&lt;span&gt; &lt;/span&gt;수도&lt;span&gt; &lt;/span&gt;있습니다&lt;span&gt;. &lt;/span&gt;이&lt;span&gt; &lt;/span&gt;경우에는&lt;span&gt; &lt;/span&gt;정렬에&lt;span&gt; &lt;/span&gt;사용될&lt;span&gt; &lt;/span&gt;값을&lt;span&gt; &lt;/span&gt;반환하는&lt;span&gt; &lt;/span&gt;함수를&lt;span&gt; &lt;/span&gt;제공합니다&lt;span&gt;. &lt;/span&gt;예를&lt;span&gt; &lt;/span&gt;들어&lt;span&gt;, &lt;/span&gt;절대값을&lt;span&gt; &lt;/span&gt;기준으로&lt;span&gt; &lt;/span&gt;정렬하는&lt;span&gt; &lt;/span&gt;경우&lt;/p&gt;
&lt;pre id=&quot;code_1705846494305&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;numbers = [-5, 3, -1, 8, -2, 7]
sorted_numbers_abs = sorted(numbers, key=abs)
print(sorted_numbers_abs)  # 출력: [-1, -2, 3, -5, 7, 8]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리의 경우&lt;/p&gt;
&lt;pre id=&quot;code_1705846965876&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 딕셔너리를 키를 기준으로 정렬
my_dict = {'apple': 3, 'banana': 1, 'orange': 5, 'grape': 2}
sorted_dict_keys = dict(sorted(my_dict.items()))
print(sorted_dict_keys)
# 결과: {'apple': 3, 'banana': 1, 'grape': 2, 'orange': 5}

# 딕셔너리를 값으로 기준으로 정렬
sorted_dict_values = dict(sorted(my_dict.items(), key=lambda item: item[1]))
print(sorted_dict_values)
# 결과: {'banana': 1, 'grape': 2, 'apple': 3, 'orange': 5}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫&lt;span&gt; &lt;/span&gt;번째&lt;span&gt; &lt;/span&gt;예제에서는&lt;b&gt;&lt;span&gt; sorted &lt;/span&gt;&lt;/b&gt;함수를&lt;span&gt; &lt;/span&gt;사용하여&lt;span&gt; &lt;/span&gt;딕셔너리를&lt;span&gt; &lt;/span&gt;키를&lt;span&gt; &lt;/span&gt;기준으로&lt;span&gt; &lt;/span&gt;정렬합니다&lt;span&gt;. &lt;/span&gt;두&lt;span&gt; &lt;/span&gt;번째&lt;span&gt; &lt;/span&gt;예제에서는&lt;b&gt;&lt;span&gt; key &lt;/span&gt;&lt;/b&gt;매개변수를&lt;span&gt; &lt;/span&gt;람다&lt;span&gt; &lt;/span&gt;함수와&lt;span&gt; &lt;/span&gt;함께&lt;span&gt; &lt;/span&gt;사용하여&lt;span&gt; &lt;/span&gt;값을&lt;span&gt; &lt;/span&gt;기준으로&lt;span&gt; &lt;/span&gt;정렬합니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오브젝트 속성값의 경우&lt;/p&gt;
&lt;pre id=&quot;code_1705846989908&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 오브젝트의 속성을 기준으로 정렬
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# Person 객체 리스트 생성
people = [Person('Alice', 30), Person('Bob', 25), Person('Charlie', 35)]

# 'age' 속성을 기준으로 객체 리스트 정렬
sorted_people = sorted(people, key=lambda person: person.age)
for person in sorted_people:
    print(f&quot;{person.name}: {person.age}세&quot;)
# 결과:
# Bob: 25세
# Alice: 30세
# Charlie: 35세&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&lt;span&gt; &lt;/span&gt;예제에서는&lt;b&gt;&lt;span&gt; 'age' &lt;/span&gt;&lt;/b&gt;속성을&lt;span&gt; &lt;/span&gt;기준으로&lt;span&gt; Person &lt;/span&gt;객체&lt;span&gt; &lt;/span&gt;리스트를&lt;span&gt; &lt;/span&gt;정렬하기&lt;span&gt; &lt;/span&gt;위해&lt;b&gt;&lt;span&gt; sorted &lt;/span&gt;&lt;/b&gt;함수를&lt;span&gt; &lt;/span&gt;사용합니다&lt;span&gt;. &lt;b&gt;key &lt;/b&gt;&lt;/span&gt;매개변수는&lt;b&gt;&lt;span&gt; 'age' &lt;/span&gt;&lt;/b&gt;속성을&lt;span&gt; &lt;/span&gt;비교하기&lt;span&gt; &lt;/span&gt;위한&lt;span&gt; &lt;/span&gt;람다&lt;span&gt; &lt;/span&gt;함수와&lt;span&gt; &lt;/span&gt;함께&lt;span&gt; &lt;/span&gt;활용됩니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 안에 딕셔너리가 있는 경우&lt;/p&gt;
&lt;pre id=&quot;code_1705847319301&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 리스트 안에 딕셔너리가 있는 경우
people_list = [
    {'name': 'Alice', 'age': 30, 'city': 'New York'},
    {'name': 'Bob', 'age': 25, 'city': 'San Francisco'},
    {'name': 'Charlie', 'age': 35, 'city': 'Los Angeles'}
]

# 'age'를 기준으로 딕셔너리 정렬
sorted_people = sorted(people_list, key=lambda person: person['age'])
for person in sorted_people:
    print(f&quot;Name: {person['name']}, Age: {person['age']}, City: {person['city']}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한&lt;span&gt; &lt;/span&gt;방식으로&lt;span&gt; sorted &lt;/span&gt;함수를&lt;span&gt; &lt;/span&gt;활용하여&lt;span&gt; &lt;/span&gt;다양한&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;정렬할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조. &lt;a href=&quot;https://docs.python.org/ko/3/howto/sorting.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.python.org/ko/3/howto/sorting.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>공부/Python</category>
      <category>Python</category>
      <category>python dict 정렬</category>
      <category>python sorted</category>
      <category>python 딕셔너리 정렬</category>
      <category>python 정렬</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/297</guid>
      <comments>https://light-tree.tistory.com/297#entry297comment</comments>
      <pubDate>Mon, 22 Jan 2024 00:30:23 +0900</pubDate>
    </item>
    <item>
      <title>Optimizing Database Performance with Index: Choosing Between btree, hash, text, rtree and Examples</title>
      <link>https://light-tree.tistory.com/296</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Pros and Cons of Using Index&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pros&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Improved Search Performance: Index efficiently facilitates record retrieval in tables, particularly enhancing search speed in large databases.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Enhanced Sorting and Grouping Performance: Queries involving sorting or grouping can benefit from improved performance.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reinforced Unique Constraint: Indexes prevent duplicates and strengthen uniqueness constraints.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cons&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Storage Space Consumption: Indexes require additional storage space. Tables with numerous indexes may pose a disk space challenge.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Performance Degradation during Data Updates: Tables with many indexes may experience performance degradation when adding, modifying, or deleting records due to the need for index updates.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Management Complexity: Effective index management may necessitate additional maintenance efforts.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Types of Index and Use Cases:&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B-Tree Index&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pros: Effective for range queries and sorted data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cons: Performance may decrease with specific data distributions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Example: Useful for queries involving order dates or user IDs.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt; &lt;/span&gt;Hash Index&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pros: Fast for exact value lookups but unsuitable for range queries.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cons: Not recommended for queries requiring range conditions or sorting.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Example: Applied when precise matching is essential.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Full Text Index&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pros: Effective for text searches.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cons: Supported by some databases and generally suitable for specific types of data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Example: Used for word or keyword searches within documents.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;R-Tree Index&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pros: Effective for spatial data searches in Geographic Information Systems (GIS).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cons: Not suitable for general data.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Example: Applied in databases containing geographic location information.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Index Application Based on Query Construction&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Index Applied&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When the indexed column is included in search conditions.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In cases where indexes can be utilized for sorting or grouping.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When columns used in JOIN operations are indexed.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Index Not Applied&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;When functions or operations are performed on indexed columns.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;If indexed columns are transformed in the WHERE clause.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In situations where only a portion of data is required (even with index usage, scanning all data may be necessary).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For example,&lt;/p&gt;
&lt;pre id=&quot;code_1705589851822&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- Table creation with Full Text Index
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    user_name VARCHAR(255),
    user_description TEXT,
    FULLTEXT(user_name, user_description)
);

-- Inserting sample data
INSERT INTO users (user_id, user_name, user_description) VALUES
(1, 'John Doe', 'A software engineer with a passion for technology.'),
(2, 'Jane Smith', 'An artist specializing in abstract paintings.'),
(3, 'Bob Johnson', 'A chef exploring the world of culinary delights.');

-- Query utilizing Full Text Index
SELECT * FROM users WHERE MATCH(user_name, user_description) AGAINST('technology');

-- Query where Full Text Index may not be applied
SELECT * FROM users WHERE user_description LIKE '%passion%';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The &lt;b&gt;CREATE TABLE&lt;/b&gt; statement includes the creation of a &lt;b&gt;FULLTEXT&lt;/b&gt; index on the &lt;b&gt;user_name&lt;/b&gt; and &lt;b&gt;user_description&lt;/b&gt; columns.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sample data is inserted into the &lt;b&gt;users&lt;/b&gt; table.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The first query uses the &lt;b&gt;MATCH...AGAINST&lt;/b&gt; syntax to perform a Full Text search on the indexed columns.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;The second query, where the &lt;b&gt;LIKE&lt;/b&gt; clause involves a wildcard at the beginning of the search term, may not fully utilize the Full Text Index.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;This example illustrates the application of a Full Text Index in a scenario where a Full Text search is performed. Keep in mind that the effectiveness of Full Text Indexes depends on the specific database system you are using, as support and syntax may vary.&lt;/p&gt;</description>
      <category>공부/TIL(을 빙자한 기타)</category>
      <category>btree</category>
      <category>database</category>
      <category>DataBase index</category>
      <category>db</category>
      <category>DB Index</category>
      <category>full text</category>
      <category>hash</category>
      <category>rtree</category>
      <category>SQL</category>
      <category>SQL INDEX</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/296</guid>
      <comments>https://light-tree.tistory.com/296#entry296comment</comments>
      <pubDate>Sun, 21 Jan 2024 01:02:55 +0900</pubDate>
    </item>
    <item>
      <title>Database 성능 향상을 위한 Index 최적화: btree, hash, text, rtree의 선택과 예시</title>
      <link>https://light-tree.tistory.com/295</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;Index 사용의 장단점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 성능 향상: Index는 테이블에서 레코드를 검색하는 데에 효율적으로 사용됩니다. 특히 대용량의 데이터베이스에서 검색 속도를 향상시키는 데 도움이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 및 그룹화 성능 향상: 정렬 또는 그룹화와 관련된 쿼리에서도 성능이 향상될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고유 제약 조건 강화: Index는 중복을 방지하며, 유일성을 강화하는데 사용될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 공간 소모: Index는 추가적인 저장 공간을 필요로 합니다. 대용량의 테이블에서 많은 인덱스를 가지고 있으면 디스크 공간이 부담스러울 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 갱신 시 성능 저하: 인덱스가 많은 테이블에서 레코드를 추가, 수정 또는 삭제할 때 성능이 감소할 수 있습니다. 이는 인덱스의 업데이트와 관련이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리 복잡성: Index를 효과적으로 관리하기 위해서는 추가적인 유지보수가 필요할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Index 종류와 사용 예시&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;B-Tree 인덱스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점: 범위 쿼리 및 정렬된 데이터에 효과적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점: 특정 데이터 분포에서는 성능이 감소할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;주문&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;날짜&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용자&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;아이디&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;등&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;범위&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;쿼리에&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Hash 인덱스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점: 일치하는 값 검색에 빠르지만 범위 쿼리에는 적합하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점: 범위 쿼리 및 정렬이 필요한 경우 사용하지 않는 것이 좋습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;span&gt;: &lt;/span&gt;정확한&lt;span&gt; &lt;/span&gt;일치&lt;span&gt; &lt;/span&gt;검색이&lt;span&gt; &lt;/span&gt;필요한&lt;span&gt; &lt;/span&gt;경우에&lt;span&gt; &lt;/span&gt;사용됩니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Full Text 인덱스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점: 텍스트 검색에 효과적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점: 일부 데이터베이스에서만 지원되며, 일반적으로 기본적인 검색보다는 특정한 유형의 데이터에 적합합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;span&gt;: &lt;/span&gt;문서&lt;span&gt; &lt;/span&gt;내의&lt;span&gt; &lt;/span&gt;단어&lt;span&gt; &lt;/span&gt;또는&lt;span&gt; &lt;/span&gt;키워드&lt;span&gt; &lt;/span&gt;검색에&lt;span&gt; &lt;/span&gt;사용됩니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;R-Tree 인덱스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점: 지리 정보 시스템(GIS)에서 공간 데이터 검색에 효과적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점: 일반적인 데이터에는 적합하지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;span&gt;: &lt;/span&gt;지리적&lt;span&gt; &lt;/span&gt;위치&lt;span&gt; &lt;/span&gt;정보를&lt;span&gt; &lt;/span&gt;가진&lt;span&gt; &lt;/span&gt;데이터베이스에서&lt;span&gt; &lt;/span&gt;사용됩니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Query 작성에 따른 Index 적용 여부&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Index 적용되는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색 조건에 인덱스된 열이 포함된 경우.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 또는 그룹화에 인덱스가 사용될 수 있는 경우.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;JOIN &lt;/span&gt;연산에&lt;span&gt; &lt;/span&gt;사용되는&lt;span&gt; &lt;/span&gt;열이&lt;span&gt; &lt;/span&gt;인덱스된&lt;span&gt; &lt;/span&gt;경우&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Index 적용되지 않는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스된 열에 대해 함수나 연산이 수행되는 경우.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE 절에 인덱스된 열을 변형한 경우.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터의&lt;span&gt; &lt;/span&gt;일부만&lt;span&gt; &lt;/span&gt;필요한&lt;span&gt; &lt;/span&gt;경우&lt;span&gt; (&lt;/span&gt;인덱스를&lt;span&gt; &lt;/span&gt;사용하더라도&lt;span&gt; &lt;/span&gt;모든&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;스캔해야&lt;span&gt; &lt;/span&gt;할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있음&lt;span&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 full text의 경우&lt;/p&gt;
&lt;pre id=&quot;code_1705589990062&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- Full Text Index가 포함된 테이블 생성
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    user_name VARCHAR(255),
    user_description TEXT,
    FULLTEXT(user_name, user_description)
);

-- 샘플 데이터 삽입
INSERT INTO users (user_id, user_name, user_description) VALUES
(1, 'John Doe', '기술에 열정을 갖고 있는 소프트웨어 엔지니어.'),
(2, 'Jane Smith', '추상 회화에 특화된 예술가.'),
(3, 'Bob Johnson', '요리의 세계를 탐험하는 셰프.');

-- Full Text Index를 활용한 쿼리
SELECT * FROM users WHERE MATCH(user_name, user_description) AGAINST('기술');

-- Full Text Index가 적용되지 않을 수 있는 쿼리
SELECT * FROM users WHERE user_description LIKE '%열정%';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE TABLE&lt;/b&gt; 문은 &lt;b&gt;user_name&lt;/b&gt; 및 &lt;b&gt;user_description&lt;/b&gt; 열에 &lt;b&gt;FULLTEXT&lt;/b&gt; 인덱스를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;샘플 데이터가 &lt;b&gt;users&lt;/b&gt; 테이블에 삽입됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 쿼리는 &lt;b&gt;MATCH...AGAINST&lt;/b&gt; 구문을 사용하여 Full Text 검색을 수행하며 인덱스를 활용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 쿼리는 &lt;b&gt;LIKE&lt;/b&gt; 구문이 검색어의 시작에 와일드카드를 사용하므로 Full Text Index가 완전히 활용되지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이&lt;/span&gt; &lt;span&gt;예시는&lt;/span&gt; Full Text Index&lt;span&gt;를&lt;/span&gt; &lt;span&gt;활용하여&lt;/span&gt; Full Text &lt;span&gt;검색을&lt;/span&gt; &lt;span&gt;수행하는&lt;/span&gt; &lt;span&gt;시나리오를&lt;/span&gt; &lt;span&gt;보여줍니다&lt;/span&gt;. Full Text Index&lt;span&gt;의&lt;/span&gt; &lt;span&gt;효과는&lt;/span&gt; &lt;span&gt;사용하는&lt;/span&gt; &lt;span&gt;구체적인&lt;/span&gt; &lt;span&gt;데이터베이스&lt;/span&gt; &lt;span&gt;시스템에&lt;/span&gt; &lt;span&gt;따라&lt;/span&gt; &lt;span&gt;달라질&lt;/span&gt; &lt;span&gt;수&lt;/span&gt; &lt;span&gt;있습니다&lt;/span&gt;.&lt;/p&gt;</description>
      <category>공부/TIL(을 빙자한 기타)</category>
      <category>btree</category>
      <category>database</category>
      <category>DataBase index</category>
      <category>db</category>
      <category>DB Index</category>
      <category>full text</category>
      <category>hash</category>
      <category>SQL</category>
      <category>SQL INDEX</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/295</guid>
      <comments>https://light-tree.tistory.com/295#entry295comment</comments>
      <pubDate>Sat, 20 Jan 2024 00:48:50 +0900</pubDate>
    </item>
    <item>
      <title>CheckConstraint를 사용하여 SQLAlchemy 문자열 형식 제한하기</title>
      <link>https://light-tree.tistory.com/294</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;SQLAlchemy에서 column의 데이터에 대한 특정한 형식을 강제하려면, &lt;b&gt;CheckConstraint&lt;/b&gt;나 &lt;b&gt;server_default&lt;/b&gt;와 같은 방법을 사용하여 데이터의 유효성을 검증하고, 필요에 따라 변환을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를&lt;span&gt; &lt;/span&gt;들어&lt;span&gt;, CheckConstraint&lt;/span&gt;를&lt;span&gt; &lt;/span&gt;사용하여&lt;span&gt; &lt;/span&gt;정규&lt;span&gt; &lt;/span&gt;표현식을&lt;span&gt; &lt;/span&gt;이용해&lt;span&gt; &lt;/span&gt;유효성을&lt;span&gt; &lt;/span&gt;검증하는&lt;span&gt; &lt;/span&gt;방법은&lt;span&gt; &lt;/span&gt;다음과&lt;span&gt; &lt;/span&gt;같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1705376581351&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sqlalchemy import Column, String, create_engine, CheckConstraint
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'my_table'
    
    user_id = Column(String(36), nullable=False, server_default='', comment=&quot;User ID&quot;)
    
    # 유효성 검증을 위한 정규 표현식
    __table_args__ = (
        CheckConstraint(&quot;user_id ~ '^[a-f0-9-]{36}$'&quot;, name='valid_user_id_format'),
    )

# SQLite 메모리 데이터베이스를 사용하도록 설정
engine = create_engine('sqlite:///:memory:')

# 테이블 생성
Base.metadata.create_all(engine)

# 세션 생성
Session = sessionmaker(bind=engine)
session = Session()

# 실패하는 경우
new_data = MyTable(user_id='invalid_format')
session.add(new_data)

try:
    session.commit()
except Exception as e:
    print(f&quot;Error: {e}&quot;)
    session.rollback()

# 성공하는 경우
new_data = MyTable(user_id='valid-format-12345')
session.add(new_data)
session.commit()

# 검증된 데이터베이스 확인
result = session.query(MyTable).first()
print(result.user_id)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 예에서는 &lt;b&gt;CheckConstraint&lt;/b&gt;를 사용하여 &lt;b&gt;user_id&lt;/b&gt; 값이 특정한 정규 표현식에 맞는지 확인합니다. &lt;b&gt;server_default&lt;/b&gt;는 이 필드에 값을 할당할 때 기본값을 설정하는 데 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&lt;span&gt; &lt;/span&gt;함으로써&lt;span&gt; &lt;/span&gt;특정한&lt;span&gt; &lt;/span&gt;형식의&lt;span&gt; &lt;/span&gt;문자열이&lt;span&gt; &lt;/span&gt;저장되도록&lt;span&gt; &lt;/span&gt;할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있습니다&lt;span&gt;. &lt;/span&gt;다만&lt;span&gt;, &lt;/span&gt;이러한&lt;span&gt; &lt;/span&gt;방식은&lt;span&gt; &lt;/span&gt;데이터베이스&lt;span&gt; &lt;/span&gt;엔진에&lt;span&gt; &lt;/span&gt;따라&lt;span&gt; &lt;/span&gt;지원&lt;span&gt; &lt;/span&gt;여부가&lt;span&gt; &lt;/span&gt;다를&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있습니다&lt;span&gt;. &lt;/span&gt;특히&lt;span&gt;, SQLite&lt;/span&gt;의&lt;span&gt; &lt;/span&gt;경우&lt;span&gt; &lt;/span&gt;정규&lt;span&gt; &lt;/span&gt;표현식을&lt;span&gt; &lt;/span&gt;지원하지&lt;span&gt; &lt;/span&gt;않을&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있습니다&lt;span&gt;. &lt;/span&gt;경우에&lt;span&gt; &lt;/span&gt;따라서는&lt;span&gt; &lt;/span&gt;애플리케이션&lt;span&gt; &lt;/span&gt;레벨에서&lt;span&gt; &lt;/span&gt;데이터의&lt;span&gt; &lt;/span&gt;유효성을&lt;span&gt; &lt;/span&gt;체크해야&lt;span&gt; &lt;/span&gt;할&lt;span&gt; &lt;/span&gt;수&lt;span&gt; &lt;/span&gt;있습니다&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;</description>
      <category>공부/Python</category>
      <category>Python</category>
      <category>python sqlalchemy</category>
      <category>python3</category>
      <category>sqlalchemy</category>
      <category>sqlalchemy CheckConstraint</category>
      <category>sqlalchemy column 강제</category>
      <category>sqlalchemy column 제한</category>
      <category>sqlalchemy server_default</category>
      <category>sqlalchemy 문자열 형식</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/294</guid>
      <comments>https://light-tree.tistory.com/294#entry294comment</comments>
      <pubDate>Fri, 19 Jan 2024 23:46:59 +0900</pubDate>
    </item>
    <item>
      <title>Enforcing String Format in SQLAlchemy Column using CheckConstraint</title>
      <link>https://light-tree.tistory.com/293</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;To enforce a specific format for the string stored in update_user using SQLAlchemy, you can utilize methods such as CheckConstraint or server_default to validate the data and perform transformations if necessary.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For instance, you can use CheckConstraint along with a regular expression to validate the format.&lt;/p&gt;
&lt;pre id=&quot;code_1705376161319&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sqlalchemy import Column, String, create_engine, CheckConstraint
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

Base = declarative_base()

class MyTable(Base):
    __tablename__ = 'my_table'
    
    user_id = Column(String(36), nullable=False, server_default='', comment=&quot;User ID&quot;)
    
    # Regular expression for validation
    __table_args__ = (
        CheckConstraint(&quot;user_id ~ '^[a-f0-9-]{36}$'&quot;, name='valid_user_id'),
    )

# Configure to use an SQLite in-memory database
engine = create_engine('sqlite:///:memory:')

# Create the table
Base.metadata.create_all(engine)

# Create a session
Session = sessionmaker(bind=engine)
session = Session()

# Case where validation fails
new_data = MyTable(user_id='invalid_format')
session.add(new_data)

try:
    session.commit()
except Exception as e:
    print(f&quot;Error: {e}&quot;)
    session.rollback()

# Case where validation succeeds
new_data = MyTable(user_id='valid-format-12345')
session.add(new_data)
session.commit()

# Verify the validated data in the database
result = session.query(MyTable).first()
print(result.user_id)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;In this example, &lt;b&gt;CheckConstraint&lt;/b&gt; is used to ensure that the &lt;b&gt;user_id&lt;/b&gt; value adheres to a specific regular expression. The &lt;b&gt;server_default&lt;/b&gt; is used to set a default value when assigning a value to this field.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Keep in mind that the effectiveness of this approach may depend on the database engine, as some engines may not support regular expressions. In certain cases, validation at the application level may be required.&lt;/p&gt;</description>
      <category>공부/Python</category>
      <category>checkconstraint</category>
      <category>enforcing string format</category>
      <category>Python</category>
      <category>python sqlalchemy</category>
      <category>python3</category>
      <category>sqlalchemy CheckConstraint</category>
      <category>sqlalchemy enforcing string format</category>
      <author>빛나는나무</author>
      <guid isPermaLink="true">https://light-tree.tistory.com/293</guid>
      <comments>https://light-tree.tistory.com/293#entry293comment</comments>
      <pubDate>Thu, 18 Jan 2024 23:40:04 +0900</pubDate>
    </item>
  </channel>
</rss>