# ๐Ÿ” ๐Ÿ—„ (๐Ÿ”—) ๐Ÿ’ฝ ๐Ÿ‘† ๐Ÿ’ช โš™๏ธ `encode/databases` โฎ๏ธ **FastAPI** ๐Ÿ”— ๐Ÿ’ฝ โš™๏ธ `async` & `await`. โšซ๏ธ ๐Ÿ”— โฎ๏ธ: * โœณ * โœณ * ๐Ÿ—„ ๐Ÿ‘‰ ๐Ÿ–ผ, ๐Ÿ‘ฅ ๐Ÿ”œ โš™๏ธ **๐Ÿ—„**, โ†ฉ๏ธ โšซ๏ธ โš™๏ธ ๐Ÿ‘ ๐Ÿ“ & ๐Ÿ โœ”๏ธ ๐Ÿ› ๏ธ ๐Ÿ•โ€๐Ÿฆบ. , ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ“ ๐Ÿ‘‰ ๐Ÿ–ผ & ๐Ÿƒ โšซ๏ธ. โช, ๐Ÿ‘† ๐Ÿญ ๐Ÿˆธ, ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ’š โš™๏ธ ๐Ÿ’ฝ ๐Ÿ’ฝ ๐Ÿ’– **โœณ**. !!! tip ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ› ๏ธ ๐Ÿ’ญ โšช๏ธโžก๏ธ ๐Ÿ“„ ๐Ÿ”ƒ ๐Ÿ‡ธ๐Ÿ‡ฒ ๐Ÿœ ([๐Ÿ—„ (๐Ÿ”—) ๐Ÿ’ฝ](../tutorial/sql-databases.md){.internal-link target=_blank}), ๐Ÿ’– โš™๏ธ ๐Ÿš™ ๐Ÿ”ข ๐ŸŽญ ๐Ÿ› ๏ธ ๐Ÿ’ฝ, ๐Ÿ”ฌ ๐Ÿ‘† **FastAPI** ๐Ÿ“Ÿ. ๐Ÿ‘‰ ๐Ÿ“„ ๐Ÿšซ โœ” ๐Ÿ“š ๐Ÿ’ญ, ๐ŸŒ“ ๐Ÿ˜‘ ๐Ÿ’ƒ. ## ๐Ÿ—„ & โš’ ๐Ÿ†™ `SQLAlchemy` * ๐Ÿ—„ `SQLAlchemy`. * โœ `metadata` ๐ŸŽš. * โœ ๐Ÿ“ `notes` โš™๏ธ `metadata` ๐ŸŽš. ```Python hl_lines="4 14 16-22" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` !!! tip ๐Ÿ‘€ ๐Ÿ‘ˆ ๐ŸŒ ๐Ÿ‘‰ ๐Ÿ“Ÿ ๐Ÿ˜ ๐Ÿ‡ธ๐Ÿ‡ฒ ๐Ÿš. `databases` ๐Ÿšซ ๐Ÿ”จ ๐Ÿ•ณ ๐Ÿ“ฅ. ## ๐Ÿ—„ & โš’ ๐Ÿ†™ `databases` * ๐Ÿ—„ `databases`. * โœ `DATABASE_URL`. * โœ `database` ๐ŸŽš. ```Python hl_lines="3 9 12" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` !!! tip ๐Ÿšฅ ๐Ÿ‘† ๐Ÿ”— ๐ŸŽ ๐Ÿ’ฝ (โœ… โœณ), ๐Ÿ‘† ๐Ÿ”œ ๐Ÿ’ช ๐Ÿ”€ `DATABASE_URL`. ## โœ ๐Ÿ“ ๐Ÿ‘‰ ๐Ÿ’ผ, ๐Ÿ‘ฅ ๐Ÿ— ๐Ÿ“ ๐ŸŽ ๐Ÿ ๐Ÿ“, โœ‹๏ธ ๐Ÿญ, ๐Ÿ‘† ๐Ÿ”œ ๐ŸŽฒ ๐Ÿ’š โœ ๐Ÿ‘ซ โฎ๏ธ โš—, ๐Ÿ› ๏ธ โฎ๏ธ ๐Ÿ› ๏ธ, โ™’๏ธ. ๐Ÿ“ฅ, ๐Ÿ‘‰ ๐Ÿ“„ ๐Ÿ”œ ๐Ÿƒ ๐Ÿ”—, โ–ถ๏ธ๏ธ โญ โ–ถ๏ธ ๐Ÿ‘† **FastAPI** ๐Ÿˆธ. * โœ `engine`. * โœ ๐ŸŒ ๐Ÿ“ โšช๏ธโžก๏ธ `metadata` ๐ŸŽš. ```Python hl_lines="25-28" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` ## โœ ๐Ÿท โœ Pydantic ๐Ÿท: * ๐Ÿ—’ โœ (`NoteIn`). * ๐Ÿ—’ ๐Ÿ“จ (`Note`). ```Python hl_lines="31-33 36-39" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` ๐Ÿ— ๐Ÿ‘ซ Pydantic ๐Ÿท, ๐Ÿ”ข ๐Ÿ’ฝ ๐Ÿ”œ โœ”, ๐ŸŽป (๐Ÿ—œ), & โœ (๐Ÿ“„). , ๐Ÿ‘† ๐Ÿ”œ ๐Ÿ’ช ๐Ÿ‘€ โšซ๏ธ ๐ŸŒ ๐ŸŽ“ ๐Ÿ› ๏ธ ๐Ÿฉบ. ## ๐Ÿ”— & ๐Ÿ”Œ * โœ ๐Ÿ‘† `FastAPI` ๐Ÿˆธ. * โœ ๐ŸŽ‰ ๐Ÿ•โ€๐Ÿฆบ ๐Ÿ”— & ๐Ÿ”Œ โšช๏ธโžก๏ธ ๐Ÿ’ฝ. ```Python hl_lines="42 45-47 50-52" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` ## โœ ๐Ÿ—’ โœ *โžก ๐Ÿ› ๏ธ ๐Ÿ”ข* โœ ๐Ÿ—’: ```Python hl_lines="55-58" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` !!! Note ๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ‘ฅ ๐Ÿ”— โฎ๏ธ ๐Ÿ’ฝ โš™๏ธ `await`, *โžก ๐Ÿ› ๏ธ ๐Ÿ”ข* ๐Ÿ“ฃ โฎ๏ธ `async`. ### ๐Ÿ‘€ `response_model=List[Note]` โšซ๏ธ โš™๏ธ `typing.List`. ๐Ÿ‘ˆ ๐Ÿ“„ (& โœ”, ๐ŸŽป, โ›ฝ) ๐Ÿ”ข ๐Ÿ’ฝ, `list` `Note`โ“‚. ## โœ ๐Ÿ—’ โœ *โžก ๐Ÿ› ๏ธ ๐Ÿ”ข* โœ ๐Ÿ—’: ```Python hl_lines="61-65" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` !!! Note ๐Ÿ‘€ ๐Ÿ‘ˆ ๐Ÿ‘ฅ ๐Ÿ”— โฎ๏ธ ๐Ÿ’ฝ โš™๏ธ `await`, *โžก ๐Ÿ› ๏ธ ๐Ÿ”ข* ๐Ÿ“ฃ โฎ๏ธ `async`. ### ๐Ÿ”ƒ `{**note.dict(), "id": last_record_id}` `note` Pydantic `Note` ๐ŸŽš. `note.dict()` ๐Ÿ“จ `dict` โฎ๏ธ ๐Ÿšฎ ๐Ÿ’ฝ, ๐Ÿ•ณ ๐Ÿ’–: ```Python { "text": "Some note", "completed": False, } ``` โœ‹๏ธ โšซ๏ธ ๐Ÿšซ โœ”๏ธ `id` ๐Ÿ‘. ๐Ÿ‘ฅ โœ ๐Ÿ†• `dict`, ๐Ÿ‘ˆ ๐Ÿ”Œ ๐Ÿ”‘-๐Ÿ’ฒ ๐Ÿ‘ซ โšช๏ธโžก๏ธ `note.dict()` โฎ๏ธ: ```Python {**note.dict()} ``` `**note.dict()` "unpacks" the key value pairs directly, so, `{**note.dict()}` would be, more or less, a copy of `note.dict()`. & โคด๏ธ, ๐Ÿ‘ฅ โ†” ๐Ÿ‘ˆ ๐Ÿ“ `dict`, โŽ โž•1๏ธโƒฃ ๐Ÿ”‘-๐Ÿ’ฒ ๐Ÿ‘ซ: `"id": last_record_id`: ```Python {**note.dict(), "id": last_record_id} ``` , ๐Ÿ ๐Ÿ ๐Ÿ“จ ๐Ÿ”œ ๐Ÿ•ณ ๐Ÿ’–: ```Python { "id": 1, "text": "Some note", "completed": False, } ``` ## โœ… โšซ๏ธ ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ“ ๐Ÿ‘‰ ๐Ÿ“Ÿ, & ๐Ÿ‘€ ๐Ÿฉบ http://127.0.0.1:8000/docs. ๐Ÿ“ค ๐Ÿ‘† ๐Ÿ’ช ๐Ÿ‘€ ๐ŸŒ ๐Ÿ‘† ๐Ÿ› ๏ธ ๐Ÿ“„ & ๐Ÿ”— โฎ๏ธ โšซ๏ธ: ## ๐ŸŒ… โ„น ๐Ÿ‘† ๐Ÿ’ช โœ ๐ŸŒ… ๐Ÿ”ƒ `encode/databases` ๐Ÿšฎ ๐Ÿ“‚ ๐Ÿ“ƒ.