From 1c2ecbb89a7f1ce79f470f78a99af975de884c66 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 25 Mar 2019 22:17:31 +0400 Subject: [PATCH] :sparkles: Add docs and tests for encode/databases (#107) * :sparkles: Add docs and tests for encode/databases * :heavy_plus_sign: Add testing-only dependency, databases --- Pipfile | 1 + Pipfile.lock | 90 +++++++--- .../tutorial/async-sql-databases/image01.png | Bin 0 -> 70687 bytes docs/src/async_sql_databases/tutorial001.py | 65 +++++++ docs/tutorial/async-sql-databases.md | 160 ++++++++++++++++++ mkdocs.yml | 1 + pyproject.toml | 3 +- .../test_async_sql_databases/__init__.py | 0 .../test_tutorial001.py | 131 ++++++++++++++ 9 files changed, 431 insertions(+), 20 deletions(-) create mode 100644 docs/img/tutorial/async-sql-databases/image01.png create mode 100644 docs/src/async_sql_databases/tutorial001.py create mode 100644 docs/tutorial/async-sql-databases.md create mode 100644 tests/test_tutorial/test_async_sql_databases/__init__.py create mode 100644 tests/test_tutorial/test_async_sql_databases/test_tutorial001.py diff --git a/Pipfile b/Pipfile index 1fd9b869c2..bb2af4dddb 100644 --- a/Pipfile +++ b/Pipfile @@ -27,6 +27,7 @@ uvicorn = "*" [packages] starlette = "==0.11.1" pydantic = "==0.21.0" +databases = {extras = ["sqlite"],version = "*"} [requires] python_version = "3.6" diff --git a/Pipfile.lock b/Pipfile.lock index 839342b1b5..1c100d1f2b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "676c6ae13691eef64abe6638f833cb8a330612521d3fad08718b240328b4877a" + "sha256": "24b3b7b88d3cbe671ddbe296e64c15f8558f0e5d5df977200119872a363aac13" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,37 @@ ] }, "default": { + "aiocontextvars": { + "hashes": [ + "sha256:1e0ff5837c8b01c36a1107acdd0baf7853ebdf6c9fc43e8e311f4be37ac2038a", + "sha256:6ff7aee14f549d52f0446cbb84d0deddcd3fc677bcf8fbc2ce13f5756d2064dc" + ], + "markers": "python_version < '3.7'", + "version": "==0.2.1" + }, + "aiosqlite": { + "hashes": [ + "sha256:af4fed9e778756fa0ffffc7a8b14c4d7b1a57155dc5669f18e45107313f6019e" + ], + "version": "==0.9.0" + }, + "contextvars": { + "hashes": [ + "sha256:2341042e1c03a271813e07dba29b6b60fa85c1005ea5ed1638a076cf50b4d625" + ], + "markers": "python_version < '3.7'", + "version": "==2.3" + }, + "databases": { + "extras": [ + "sqlite" + ], + "hashes": [ + "sha256:4a0f15669c390a04b439972426350c0ae921ddc08c42bd54f125eb2fb86ee728" + ], + "index": "pypi", + "version": "==0.2.0" + }, "dataclasses": { "hashes": [ "sha256:454a69d788c7fda44efd71e259be79577822f5e3f53f029a22d08004e951dc9f", @@ -24,6 +55,22 @@ "markers": "python_version < '3.7'", "version": "==0.6" }, + "immutables": { + "hashes": [ + "sha256:1e4f4513254ef11e0230a558ee0dcb4551b914993c330005d15338da595d3750", + "sha256:228e38dc7a810ba4ff88909908ac47f840e5dc6c4c0da6b25009c626a9ae771c", + "sha256:2ae88fbfe1d04f4e5859c924e97313edf70e72b4f19871bf329b96a67ede9ba0", + "sha256:2d32b61c222cba1dd11f0faff67c7fb6204ef1982454e1b5b001d4b79966ef17", + "sha256:35af186bfac5b62522fdf2cab11120d7b0547f405aa399b6a1e443cf5f5e318c", + "sha256:63023fa0cceedc62e0d1535cd4ca7a1f6df3120a6d8e5c34e89037402a6fd809", + "sha256:6bf5857f42a96331fd0929c357dc0b36a72f339f3b6acaf870b149c96b141f69", + "sha256:7bb1590024a032c7a57f79faf8c8ff5e91340662550d2980e0177f67e66e9c9c", + "sha256:7c090687d7e623d4eca22962635b5e1a1ee2d6f9a9aca2f3fb5a184a1ffef1f2", + "sha256:bc36a0a8749881eebd753f696b081bd51145e4d77291d671d2e2f622e5b65d2f", + "sha256:d9fc6a236018d99af6453ead945a6bb55f98d14b1801a2c229dd993edc753a00" + ], + "version": "==0.6" + }, "pydantic": { "hashes": [ "sha256:93fa585402e7c8c01623ea8af6ca23363e8b4c6a020b7a2de9e99fa29d642d50", @@ -32,6 +79,12 @@ "index": "pypi", "version": "==0.21.0" }, + "sqlalchemy": { + "hashes": [ + "sha256:781fb7b9d194ed3fc596b8f0dd4623ff160e3e825dd8c15472376a438c19598b" + ], + "version": "==1.3.1" + }, "starlette": { "hashes": [ "sha256:9d48b35d1fc7521d59ae53c421297ab3878d3c7cd4b75266d77f6c73cccb78bb" @@ -242,11 +295,11 @@ }, "ipython": { "hashes": [ - "sha256:06de667a9e406924f97781bda22d5d76bfb39762b678762d86a466e63f65dc39", - "sha256:5d3e020a6b5f29df037555e5c45ab1088d6a7cf3bd84f47e0ba501eeb0c3ec82" + "sha256:b038baa489c38f6d853a3cfc4c635b0cda66f2864d136fe8f40c1a6e334e2a6b", + "sha256:f5102c1cd67e399ec8ea66bcebe6e3968ea25a8977e53f012963e5affeb1fe38" ], "markers": "python_version >= '3.3'", - "version": "==7.3.0" + "version": "==7.4.0" }, "ipython-genutils": { "hashes": [ @@ -264,11 +317,11 @@ }, "isort": { "hashes": [ - "sha256:18c796c2cd35eb1a1d3f012a214a542790a1aed95e29768bdcb9f2197eccbd0b", - "sha256:96151fca2c6e736503981896495d344781b60d18bfda78dc11b290c6125ebdb6" + "sha256:08f8e3f0f0b7249e9fad7e5c41e2113aba44969798a26452ee790c06f155d4ec", + "sha256:4e9e9c4bd1acd66cf6c36973f29b031ec752cbfd991c69695e4e259f9a756927" ], "index": "pypi", - "version": "==4.3.15" + "version": "==4.3.16" }, "jedi": { "hashes": [ @@ -399,11 +452,11 @@ }, "mkdocs-material": { "hashes": [ - "sha256:762a71f82c1e291c3ff067cecd9d581557da777332fd98bc0af20fd5ab4a2dd0", - "sha256:b2c7174ecaa81fb1d62a5f4906f99fa0e7062ced8f9a14ec4f60b1bef9feebbf" + "sha256:0b394aa034b25a09a5874ae2a6ccc426fd81f5764e0991217b169e31cb0c1c0e", + "sha256:f5bb80a2c16d045d380edb2c5b05636af1bb709cb859bfaa9d01063a11df803f" ], "index": "pypi", - "version": "==4.0.2" + "version": "==4.1.0" }, "more-itertools": { "hashes": [ @@ -662,7 +715,6 @@ "hashes": [ "sha256:781fb7b9d194ed3fc596b8f0dd4623ff160e3e825dd8c15472376a438c19598b" ], - "index": "pypi", "version": "==1.3.1" }, "terminado": { @@ -688,15 +740,15 @@ }, "tornado": { "hashes": [ - "sha256:1a58f2d603476d5e462f7c28ca1dbb5ac7e51348b27a9cac849cdec3471101f8", - "sha256:33f93243cd46dd398e5d2bbdd75539564d1f13f25d704cfc7541db74066d6695", - "sha256:34e59401afcecf0381a28228daad8ed3275bcb726810654612d5e9c001f421b7", - "sha256:35817031611d2c296c69e5023ea1f9b5720be803e3bb119464bb2a0405d5cd70", - "sha256:666b335cef5cc2759c21b7394cff881f71559aaf7cb8c4458af5bb6cb7275b47", - "sha256:81203efb26debaaef7158187af45bc440796de9fb1df12a75b65fae11600a255", - "sha256:de274c65f45f6656c375cdf1759dbf0bc52902a1e999d12a35eb13020a641a53" + "sha256:1174dcb84d08887b55defb2cda1986faeeea715fff189ef3dc44cce99f5fca6b", + "sha256:2613fab506bd2aedb3722c8c64c17f8f74f4070afed6eea17f20b2115e445aec", + "sha256:44b82bc1146a24e5b9853d04c142576b4e8fa7a92f2e30bc364a85d1f75c4de2", + "sha256:457fcbee4df737d2defc181b9073758d73f54a6cfc1f280533ff48831b39f4a8", + "sha256:49603e1a6e24104961497ad0c07c799aec1caac7400a6762b687e74c8206677d", + "sha256:8c2f40b99a8153893793559919a355d7b74649a11e59f411b0b0a1793e160bc0", + "sha256:e1d897889c3b5a829426b7d52828fb37b28bc181cd598624e65c8be40ee3f7fa" ], - "version": "==6.0.1" + "version": "==6.0.2" }, "traitlets": { "hashes": [ diff --git a/docs/img/tutorial/async-sql-databases/image01.png b/docs/img/tutorial/async-sql-databases/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..01dc369a0b3c6b7390fb3ad6edda645e876a622b GIT binary patch literal 70687 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 D!lkZ{ literal 0 Hc-jL100001 diff --git a/docs/src/async_sql_databases/tutorial001.py b/docs/src/async_sql_databases/tutorial001.py new file mode 100644 index 0000000000..cbf43d790f --- /dev/null +++ b/docs/src/async_sql_databases/tutorial001.py @@ -0,0 +1,65 @@ +from typing import List + +import databases +import sqlalchemy +from fastapi import FastAPI +from pydantic import BaseModel + +# SQLAlchemy specific code, as with any other app +DATABASE_URL = "sqlite:///./test.db" +# DATABASE_URL = "postgresql://user:password@postgresserver/db" + +database = databases.Database(DATABASE_URL) + +metadata = sqlalchemy.MetaData() + +notes = sqlalchemy.Table( + "notes", + metadata, + sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True), + sqlalchemy.Column("text", sqlalchemy.String), + sqlalchemy.Column("completed", sqlalchemy.Boolean), +) + + +engine = sqlalchemy.create_engine( + DATABASE_URL, connect_args={"check_same_thread": False} +) +metadata.create_all(engine) + + +class NoteIn(BaseModel): + text: str + completed: bool + + +class Note(BaseModel): + id: int + text: str + completed: bool + + +app = FastAPI() + + +@app.on_event("startup") +async def startup(): + await database.connect() + + +@app.on_event("shutdown") +async def shutdown(): + await database.disconnect() + + +@app.get("/notes/", response_model=List[Note]) +async def read_notes(): + query = notes.select() + return await database.fetch_all(query) + + +@app.post("/notes/", response_model=Note) +async def create_note(note: NoteIn): + query = notes.insert().values(text=note.text, completed=note.completed) + last_record_id = await database.execute(query) + return {**note.dict(), "id": last_record_id} diff --git a/docs/tutorial/async-sql-databases.md b/docs/tutorial/async-sql-databases.md new file mode 100644 index 0000000000..4da6404407 --- /dev/null +++ b/docs/tutorial/async-sql-databases.md @@ -0,0 +1,160 @@ +You can also use `encode/databases` with **FastAPI** to connect to databases using `async` and `await`. + +It is compatible with: + +* PostgreSQL +* MySQL +* SQLite + +In this example, we'll use **SQLite**, because it uses a single file and Python has integrated support. So, you can copy this example and run it as is. + +Later, for your production application, you might want to use a database server like **PostgreSQL**. + +!!! tip + You could adopt ideas from the previous section about SQLAlchemy ORM, like using utility functions to perform operations in the database, independent of your **FastAPI** code. + + This section doesn't apply those ideas, to be equivalent to the counterpart in Starlette. + +## Import and set up `SQLAlchemy` + +* Import `SQLAlchemy`. +* Create a `metadata` object. +* Create a table `notes` using the `metadata` object. + +```Python hl_lines="4 14 16 17 18 19 20 21 22" +{!./src/async_sql_databases/tutorial001.py!} +``` + +!!! tip + Notice that all this code is pure SQLAlchemy Core. + + `databases` is not doing anything here yet. + +## Import and set up `databases` + +* Import `databases`. +* Create a `DATABASE_URL`. +* Create a `database` object. + +```Python hl_lines="3 9 12" +{!./src/async_sql_databases/tutorial001.py!} +``` + +!!! tip + If you where connecting to a different database (e.g. PostgreSQL), you would need to change the `DATABASE_URL`. + +## Create the tables + +In this case, we are creating the tables in the same Python file, but in production, you would probably want to create them with Alembic, integrated with migrations, etc. + +Here, this section would run directly, right before starting your **FastAPI** application. + +* Create an `engine`. +* Create all the tables from the `metadata` object. + +```Python hl_lines="25 26 27 28" +{!./src/async_sql_databases/tutorial001.py!} +``` + +## Create models + +Create Pydantic models for: + +* Notes to be created (`NoteIn`). +* Notes to be returned (`Note`). + +```Python hl_lines="31 32 33 36 37 38 39" +{!./src/async_sql_databases/tutorial001.py!} +``` + +By creating these Pydantic models, the input data will be validated, serialized (converted), and annotated (documented). + +So, you will be able to see it all in the interactive API docs. + +## Connect and disconnect + +* Create your `FastAPI` application. +* Create event handlers to connect and disconnect from the database. + +```Python hl_lines="42 45 46 47 50 51 52" +{!./src/async_sql_databases/tutorial001.py!} +``` + +## Read notes + +Create the *path operation function* to read notes: + +```Python hl_lines="55 56 57 58" +{!./src/async_sql_databases/tutorial001.py!} +``` + +!!! Note + Notice that as we communicate with the database using `await`, the *path operation function* is declared with `async`. + +### Notice the `response_model=List[Note]` + +It uses `typing.List`. + +That documents (and validates, serializes, filters) the output data, as a `list` of `Note`s. + +## Create notes + +Create the *path operation function* to create notes: + +```Python hl_lines="61 62 63 64 65" +{!./src/async_sql_databases/tutorial001.py!} +``` + +!!! Note + Notice that as we communicate with the database using `await`, the *path operation function* is declared with `async`. + +### About `{**note.dict(), "id": last_record_id}` + +`note` is a Pydantic `Note` object. + +`note.dict()` returns a `dict` with its data, something like: + +```Python +{ + "text": "Some note", + "completed": False, +} +``` + +but it doesn't have the `id` field. + +So we create a new `dict`, that contains the key-value pairs from `note.dict()` with: + +```Python +{**note.dict()} +``` + +`**note.dict()` "unpacks" the key value pairs directly, so, `{**note.dict()}` would be, more or less, a copy of `note.dict()`. + +And then, we extend that copy `dict`, adding another key-value pair: `"id": last_record_id`: + +```Python +{**note.dict(), "id": last_record_id} +``` + +So, the final result returned would be something like: + +```Python +{ + "id": 1, + "text": "Some note", + "completed": False, +} +``` + +## Check it + +You can copy this code as is, and see the docs at http://127.0.0.1:8000/docs. + +There you can see all your API documented and interact with it: + + + +## More info + +You can read more about `encode/databases` at its GitHub page. diff --git a/mkdocs.yml b/mkdocs.yml index 1eed39a8c9..f550d48678 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -57,6 +57,7 @@ nav: - OAuth2 with Password (and hashing), Bearer with JWT tokens: 'tutorial/security/oauth2-jwt.md' - Using the Request Directly: 'tutorial/using-request-directly.md' - SQL (Relational) Databases: 'tutorial/sql-databases.md' + - Async SQL (Relational) Databases: 'tutorial/async-sql-databases.md' - NoSQL (Distributed / Big Data) Databases: 'tutorial/nosql-databases.md' - Bigger Applications - Multiple Files: 'tutorial/bigger-applications.md' - Background Tasks: 'tutorial/background-tasks.md' diff --git a/pyproject.toml b/pyproject.toml index 54c28c22f2..232009c895 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,7 +37,8 @@ test = [ "isort", "requests", "email_validator", - "sqlalchemy" + "sqlalchemy", + "databases[sqlite]", ] doc = [ "mkdocs", diff --git a/tests/test_tutorial/test_async_sql_databases/__init__.py b/tests/test_tutorial/test_async_sql_databases/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py b/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py new file mode 100644 index 0000000000..0293a6dfb1 --- /dev/null +++ b/tests/test_tutorial/test_async_sql_databases/test_tutorial001.py @@ -0,0 +1,131 @@ +from starlette.testclient import TestClient + +from async_sql_databases.tutorial001 import app + +openapi_schema = { + "openapi": "3.0.2", + "info": {"title": "Fast API", "version": "0.1.0"}, + "paths": { + "/notes/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "title": "Response_Read_Notes", + "type": "array", + "items": {"$ref": "#/components/schemas/Note"}, + } + } + }, + } + }, + "summary": "Read Notes Get", + "operationId": "read_notes_notes__get", + }, + "post": { + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/Note"} + } + }, + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + }, + }, + }, + "summary": "Create Note Post", + "operationId": "create_note_notes__post", + "requestBody": { + "content": { + "application/json": { + "schema": {"$ref": "#/components/schemas/NoteIn"} + } + }, + "required": True, + }, + }, + } + }, + "components": { + "schemas": { + "NoteIn": { + "title": "NoteIn", + "required": ["text", "completed"], + "type": "object", + "properties": { + "text": {"title": "Text", "type": "string"}, + "completed": {"title": "Completed", "type": "boolean"}, + }, + }, + "Note": { + "title": "Note", + "required": ["id", "text", "completed"], + "type": "object", + "properties": { + "id": {"title": "Id", "type": "integer"}, + "text": {"title": "Text", "type": "string"}, + "completed": {"title": "Completed", "type": "boolean"}, + }, + }, + "ValidationError": { + "title": "ValidationError", + "required": ["loc", "msg", "type"], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": {"type": "string"}, + }, + "msg": {"title": "Message", "type": "string"}, + "type": {"title": "Error Type", "type": "string"}, + }, + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": {"$ref": "#/components/schemas/ValidationError"}, + } + }, + }, + } + }, +} + + +def test_openapi_schema(): + with TestClient(app) as client: + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + + +def test_create_read(): + with TestClient(app) as client: + note = {"text": "Foo bar", "completed": False} + response = client.post("/notes/", json=note) + assert response.status_code == 200 + data = response.json() + assert data["text"] == note["text"] + assert data["completed"] == note["completed"] + assert "id" in data + response = client.get(f"/notes/") + assert response.status_code == 200 + assert data in response.json() -- 2.47.3