콘텐츠로 이동

데이터베이스에 데이터 삽입

다음 방법을 사용하면 데이터베이스에 데이터를 삽입할 수 있습니다.

  • 만들기(**Kwargs) -> 모델

  • get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

  • update_or_create(**kwargs) -> Model

  • bulk_create(objects: List[Model]) -> None

  • Model*Model.save() 방법*Model.up() 방법*Model.save_lated() 방법

  • 쿼리 세트 에이전트*QuerysetProxy.create(**kwargs) 방법*QuerysetProxy.get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) 방법*QuerysetProxy.update_or_create(**kwargs) 방법

만들기

생성(**kwargs):-> 모델

모델 인스턴스를 만들고 데이터베이스에 저장한 다음 모델을 업데이트하기 위해 돌아갑니다(전달되지 않고 자동 증분이 설정된 경우 pk가 채워집니다).

허용된 kwargs는 모델 필드 이름과 올바른 값 유형입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
클래스 앨범(ormar. 모델):
    ormar_config = ormar. OrmarConfig (
        데이터베이스 = 데이터베이스,
        메타데이터 = 메타데이터,
        테이블 이름 = "앨범"
    )


    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)


말리부 = Album을 기다립니다.
트랙.ts.create를 기다립니다(앨범 = 말리부, 제목 = "새", 위치 = 1)

또 다른 접근 방식은 모델 분할 생성과 지속성입니다.

1
2
말리부 = 앨범 (이름 = "말리부")
기다려malibu.save()

팁

획득 또는 생성

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

방법의 조합을 만들고 가져옵니다.

기준을 충족하는 행을 가져오려고 시도하고 NoMatch 예외가 발생하면 지정된 kwargs 및 _de로 새 행이 생성됩니다.

_de 사전을 제공할 때 명시적으로 제공된 값을 재정의하는 것을 포함하여 _de에서 설정된 값은 항상 설정됩니다. IE get_or_create(_defaults: {"title": "I win"}, title="never used") 는 kwargs에서 자신의 가치를 제공하든 그렇지 않든 항상 "I win"을 제목으로 사용합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
클래스 앨범(ormar. 모델):
    ormar_config = ormar. OrmarConfig (
        데이터베이스 = 데이터베이스,
        메타데이터 = 메타데이터,
        테이블 이름 = "앨범"
    )

    ID: int = ormar. 정수(prial_key = 참)
    이름: str = ormar. 문자열(max_long = 100)
    연도: int = ormar. 정수()


앨범, 생성됨 = Album을 기다립니다.ts.get_or_create (이름 = 'The Cat', _de ={"year": 1999})
생성된 주장은 참입니다
주장album.name== "고양이"
주장 앨범. 연도 == 1999
# 개체는 존재하지 않는 대로 생성됩니다.
Album 2, 생성됨 = Album을 기다립니다.ts.get_or_create (이름 = 'The Cat')
만들어진 주장은 거짓입니다
앨범 주장 == 앨범 2
# 같은 db 행이 반환되는 트루 반환

!!!경고: 위 예제의 앨범과 앨범 2는 데이터베이스의 동일한 행임에도 불구하고 두 개의 서로 다른 파이썬 개체입니다! 데이터베이스에서 새 데이터를 명시적으로 로드()할 때까지 두 번째 데이터를 새로 고치지 않습니다.

새 개체를 만들려면 pk 열 값을 전달하거나 pk 열을 자동 증분으로 설정해야 합니다.

업데이트 또는 생성

update_or_create(**kwargs) -> Model

모델을 업데이트하거나 데이터베이스에 일치하는 모델이 없는 경우 새 모델을 만듭니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL),
    metadata=sqlalchemy.MetaData(),
)


class Book(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    author: str = ormar.String(max_length=100)
    genre: str = ormar.String(
        max_length=100,
        default="Fiction",
    )


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    await Book.objects.create(
        title="Tom Sawyer", author="Twain, Mark", genre="Adventure"
    )
    await Book.objects.create(
        title="War and Peace", author="Tolstoy, Leo", genre="Fiction"
    )
    await Book.objects.create(
        title="Anna Karenina", author="Tolstoy, Leo", genre="Fiction"
    )

    # if not exist the instance will be persisted in db
    vol2 = await Book.objects.update_or_create(
        title="Volume II", author="Anonymous", genre="Fiction"
    )
    assert await Book.objects.count() == 4

    # if pk or pkname passed in kwargs (like id here) the object will be updated
    assert await Book.objects.update_or_create(id=vol2.id, genre="Historic")
    assert await Book.objects.count() == 4


asyncio.run(run_query())

새 개체를 만들려면 pk 열 값을 전달하거나 pk 열을 자동 증분으로 설정해야 합니다.

배치 생성

bulk_create(objects: List["Model"]) -> None

여러 개체를 동시에 만들 수 있습니다.

유효한 모델 개체 목록을 전달해야 합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL),
    metadata=sqlalchemy.MetaData(),
)


class ToDo(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="todos")

    id: int = ormar.Integer(primary_key=True)
    text: str = ormar.String(max_length=500)
    completed = ormar.Boolean(default=False)


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    # create multiple instances at once with bulk_create
    await ToDo.objects.bulk_create(
        [
            ToDo(text="Buy the groceries."),
            ToDo(text="Call Mum.", completed=True),
            ToDo(text="Send invoices.", completed=True),
        ]
    )

    todoes = await ToDo.objects.all()
    assert len(todoes) == 3


asyncio.run(run_query())

모델 방법

각 모델 인스턴스에는 저장, 업데이트 또는 로드하는 일련의 방법이 있습니다.

저장

QuerySet.create() 메서드를 사용하거나 모델을 일반 Pydantic 모델로 초기화한 다음 Save() 메서드를 호출하여 새 모델을 만들 수 있습니다.

!!!팁 모델의 저장() 방법에 대해 자세히 알아보기 - 저장

업데이트 삽입

모델의 저장() 또는 업데이트(**kwargs) 메서드의 프록시. pk가 설정되지 않은 경우 저장() 메서드가 호출됩니다.

!!!팁 모델-업퍼트의 업퍼트() 방법에 대해 자세히 알아보십시오.

관련 저장

메소드는 메소드를 호출하고 저장되지 않은 각 모델에서 up() 메서드를 호출하는 모델의 모든 관계를 반복합니다.

!!!팁 모델 저장 지연의 저장 _lated() 방법에 대해 자세히 알아보십시오.

QuerysetProxy 방법

관련 ManyTo많이 필드 및 ReverseForeignKey에 직접 액세스하면 관련 모델 목록이 반환됩니다.

그러나 쿼리 세트 API의 하위 집합도 표시되므로 상위 모델에서 직접 필터링, 생성, 관련 모델 선택 등을 할 수 있습니다.

만들기

생성 함수는 위의 함수와 동일하지만 관계의 다른 쪽 끝에서 관련 개체를 만들 수 있습니다.

!!!QuerysetProxy에 대해 자세히 알아보려면 QuerysetProxy 섹션을 방문하십시오.

획득 또는 생성

위의 get_ 또는 _ create 함수와 정확히 동일하지만 관계의 다른 쪽 끝에서 관련 개체를 쿼리하거나 만들 수 있습니다.

!!!QuerysetProxy에 대해 자세히 알아보려면 QuerysetProxy 섹션을 방문하십시오.

업데이트 또는 생성

업데이트 _ 또는 _ 생성 함수는 위와 정확히 동일하지만 관계의 다른 쪽 끝에서 관련 개체를 업데이트하거나 만들 수 있습니다.

!!!QuerysetProxy에 대해 자세히 알아보려면 QuerysetProxy 섹션을 방문하십시오.