Compare commits

..

37 Commits
0.0.2 ... 0.0.6

Author SHA1 Message Date
Sebastián Ramírez
7fcd4fd7c5 🔖 Release version 0.0.6 2021-12-28 12:27:33 +01:00
Sebastián Ramírez
9203df6af1 📝 Update release notes 2021-12-28 12:26:52 +01:00
github-actions
d6d77a9ee4 📝 Update release notes 2021-12-28 10:48:37 +00:00
Sebastián Ramírez
155c6178cd Document indexes and make them opt-in (#205) 2021-12-28 11:48:03 +01:00
github-actions
3d7b74746c 📝 Update release notes 2021-12-14 18:25:46 +00:00
Yaqueline Hoyos
410d7af6b6 ✏ Fix typo in FastAPI tutorial (#192) 2021-12-14 19:25:06 +01:00
github-actions
1b99c3148f 📝 Update release notes 2021-12-14 17:30:07 +00:00
Nikita Sobolev
6cf94a9797 📝 Add links to the license file (#29)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2021-12-14 18:29:28 +01:00
github-actions
a159f31945 📝 Update release notes 2021-12-14 17:21:35 +00:00
Alexandre Batisse
dc3acda4ed ✏ Fix typos in docs titles (#28) 2021-12-14 18:20:54 +01:00
github-actions
ead1bdc532 📝 Update release notes 2021-12-14 17:17:55 +00:00
Evan Grim
2013c69c4d ✏ Fix multiple typos and some rewording (#22)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2021-12-14 18:17:10 +01:00
github-actions
6615b111d9 📝 Update release notes 2021-12-14 17:12:17 +00:00
Leynier Gutiérrez González
50e62cdcd9 ✏ Fix typo in docs/tutorial/automatic-id-none-refresh.md (#14) 2021-12-14 18:11:39 +01:00
github-actions
64d7f53357 📝 Update release notes 2021-12-14 16:59:16 +00:00
Sebastian Marines
32b5b39f2d ✏ Fix typos in docs/tutorial/index.md and docs/databases.md (#5)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2021-12-14 17:58:40 +01:00
Sebastián Ramírez
02697459b8 🔖 Release version 0.0.5 2021-12-13 12:41:51 +01:00
github-actions
7eadc90558 📝 Update release notes 2021-12-13 11:38:40 +00:00
Sebastián Ramírez
95c02962ba ✏ Update decimal tutorial source for consistency (#188) 2021-12-13 11:37:59 +00:00
github-actions
75540f9728 📝 Update release notes 2021-12-13 11:30:57 +00:00
robcxyz
580f372059 Add support for Decimal fields from Pydantic and SQLAlchemy (#103)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2021-12-13 12:30:20 +01:00
github-actions
1c276ef88f 📝 Update release notes 2021-12-13 10:47:44 +00:00
Sebastián Ramírez
14a9788eb1 🔧 Split MkDocs insiders build in CI to support building from PRs (#186) 2021-12-13 11:47:07 +01:00
github-actions
dbcaa50c69 📝 Update release notes 2021-12-13 10:41:14 +00:00
Sebastián Ramírez
362eb81701 🎨 Format expression.py and expression template, currently needed by CI (#187) 2021-12-13 10:40:40 +00:00
github-actions
a36c6d5778 📝 Update release notes 2021-12-03 10:24:01 +00:00
Lehoczky Zoltán
82935cae9f 🐛Fix docs light/dark theme switcher (#1)
* 🐛Fix tooltip text for theme switcher

* 🔧 Update lightbulb icon

Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
2021-12-03 11:23:20 +01:00
github-actions
455794da2c 📝 Update release notes 2021-11-30 16:28:31 +00:00
Sebastián Ramírez
55259b3c8b 🔧 Add MkDocs Material social cards (#90) 2021-11-30 17:27:50 +01:00
github-actions
328c8c725d 📝 Update release notes 2021-11-30 16:13:10 +00:00
Sebastián Ramírez
e30c7ef4e9 Update type annotations and upgrade mypy (#173) 2021-11-30 17:12:28 +01:00
Sebastián Ramírez
02da85c9ec 🔖 Release version 0.0.4 2021-08-25 15:46:57 +02:00
github-actions
878e230782 📝 Update release notes 2021-08-25 13:44:35 +00:00
Sebastián Ramírez
1da849ac48 🎨 Fix type detection of select results in PyCharm (#15) 2021-08-25 13:43:53 +00:00
Sebastián Ramírez
af03df88ac 🔖 Release version 0.0.3 2021-08-24 20:44:18 +02:00
github-actions
d80a2fb7ed 📝 Update release notes 2021-08-24 18:43:29 +00:00
Sebastián Ramírez
230911ab42 ⬆️ Update and relax specification range for sqlalchemy-stubs (#4) 2021-08-24 20:42:52 +02:00
122 changed files with 2257 additions and 265 deletions

View File

@@ -51,8 +51,16 @@ jobs:
- name: Install Material for MkDocs Insiders
if: github.event.pull_request.head.repo.fork == false && steps.cache.outputs.cache-hit != 'true'
run: python -m poetry run pip install git+https://${{ secrets.ACTIONS_TOKEN }}@github.com/squidfunk/mkdocs-material-insiders.git
- uses: actions/cache@v2
with:
key: mkdocs-cards-${{ github.ref }}
path: .cache
- name: Build Docs
if: github.event.pull_request.head.repo.fork == true
run: python -m poetry run mkdocs build
- name: Build Docs with Insiders
if: github.event.pull_request.head.repo.fork == false
run: python -m poetry run mkdocs build --config-file mkdocs.insiders.yml
- name: Zip docs
run: python -m poetry run bash ./scripts/zip-docs.sh
- uses: actions/upload-artifact@v2

1
.gitignore vendored
View File

@@ -11,3 +11,4 @@ htmlcov
coverage.xml
site
*.db
.cache

View File

@@ -212,4 +212,4 @@ And at the same time, ✨ it is also a **Pydantic** model ✨. You can use inher
## License
This project is licensed under the terms of the MIT license.
This project is licensed under the terms of the [MIT license](https://github.com/tiangolo/sqlmodel/blob/main/LICENSE).

148
docs/advanced/decimal.md Normal file
View File

@@ -0,0 +1,148 @@
# Decimal Numbers
In some cases you might need to be able to store decimal numbers with guarantees about the precision.
This is particularly important if you are storing things like **currencies**, **prices**, **accounts**, and others, as you would want to know that you wouldn't have rounding errors.
As an example, if you open Python and sum `1.1` + `2.2` you would expect to see `3.3`, but you will actually get `3.3000000000000003`:
```Python
>>> 1.1 + 2.2
3.3000000000000003
```
This is because of the way numbers are stored in "ones and zeros" (binary). But Python has a module and some types to have strict decimal values. You can read more about it in the official <a href="https://docs.python.org/3/library/decimal.html" class="external-link" target="_blank">Python docs for Decimal</a>.
Because databases store data in the same ways as computers (in binary), they would have the same types of issues. And because of that, they also have a special **decimal** type.
In most cases this would probably not be a problem, for example measuring views in a video, or the life bar in a videogame. But as you can imagine, this is particularly important when dealing with **money** and **finances**.
## Decimal Types
Pydantic has special support for `Decimal` types using the <a href="https://pydantic-docs.helpmanual.io/usage/types/#arguments-to-condecimal" class="external-link" target="_blank">`condecimal()` special function</a>.
!!! tip
Pydantic 1.9, that will be released soon, has improved support for `Decimal` types, without needing to use the `condecimal()` function.
But meanwhile, you can already use this feature with `condecimal()` in **SQLModel** it as it's explained here.
When you use `condecimal()` you can specify the number of digits and decimal places to support. They will be validated by Pydantic (for example when using FastAPI) and the same information will also be used for the database columns.
!!! info
For the database, **SQLModel** will use <a href="https://docs.sqlalchemy.org/en/14/core/type_basics.html#sqlalchemy.types.DECIMAL" class="external-link" target="_blank">SQLAlchemy's `DECIMAL` type</a>.
## Decimals in SQLModel
Let's say that each hero in the database will have an amount of money. We could make that field a `Decimal` type using the `condecimal()` function:
```{.python .annotate hl_lines="12" }
{!./docs_src/advanced/decimal/tutorial001.py[ln:1-12]!}
# More code here later 👇
```
<details>
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/advanced/decimal/tutorial001.py!}
```
</details>
Here we are saying that `money` can have at most `5` digits with `max_digits`, **this includes the integers** (to the left of the decimal dot) **and the decimals** (to the right of the decimal dot).
We are also saying that the number of decimal places (to the right of the decimal dot) is `3`, so we can have **3 decimal digits** for these numbers in the `money` field. This means that we will have **2 digits for the integer part** and **3 digits for the decimal part**.
✅ So, for example, these are all valid numbers for the `money` field:
* `12.345`
* `12.3`
* `12`
* `1.2`
* `0.123`
* `0`
🚫 But these are all invalid numbers for that `money` field:
* `1.2345`
* This number has more than 3 decimal places.
* `123.234`
* This number has more than 5 digits in total (integer and decimal part).
* `123`
* Even though this number doesn't have any decimals, we still have 3 places saved for them, which means that we can **only use 2 places** for the **integer part**, and this number has 3 integer digits. So, the allowed number of integer digits is `max_digits` - `decimal_places` = 2.
!!! tip
Make sure you adjust the number of digits and decimal places for your own needs, in your own application. 🤓
## Create models with Decimals
When creating new models you can actually pass normal (`float`) numbers, Pydantic will automatically convert them to `Decimal` types, and **SQLModel** will store them as `Decimal` types in the database (using SQLAlchemy).
```Python hl_lines="4-6"
# Code above omitted 👆
{!./docs_src/advanced/decimal/tutorial001.py[ln:25-35]!}
# Code below omitted 👇
```
<details>
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/advanced/decimal/tutorial001.py!}
```
</details>
## Select Decimal data
Then, when working with Decimal types, you can confirm that they indeed avoid those rounding errors from floats:
```Python hl_lines="15-16"
# Code above omitted 👆
{!./docs_src/advanced/decimal/tutorial001.py[ln:38-51]!}
# Code below omitted 👇
```
<details>
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/advanced/decimal/tutorial001.py!}
```
</details>
## Review the results
Now if you run this, instead of printing the unexpected number `3.3000000000000003`, it prints `3.300`:
<div class="termy">
```console
$ python app.py
// Some boilerplate and previous output omitted 😉
// The type of money is Decimal('1.100')
Hero 1: id=1 secret_name='Dive Wilson' age=None name='Deadpond' money=Decimal('1.100')
// More output omitted here 🤓
// The type of money is Decimal('1.100')
Hero 2: id=3 secret_name='Tommy Sharp' age=48 name='Rusty-Man' money=Decimal('2.200')
// No rounding errors, just 3.3! 🎉
Total money: 3.300
```
</div>
!!! warning
Although Decimal types are supported and used in the Python side, not all databases support it. In particular, SQLite doesn't support decimals, so it will convert them to the same floating `NUMERIC` type it supports.
But decimals are supported by most of the other SQL databases. 🎉

View File

@@ -1,12 +1,10 @@
# Advanced User Guide
The **Advanced User Guide** will be coming soon to a <del>theater</del> **documentation** near you... 😅
The **Advanced User Guide** is gradually growing, you can already read about some advanced topics.
I just have to `add` it, `commit` it, and `refresh` it. 😉
At some point it will include:
It will include:
* How to use the `async` and `await` with the async session.
* How to use `async` and `await` with the async session.
* How to run migrations.
* How to combine **SQLModel** models with SQLAlchemy.
* ...and more.
* ...and more. 🤓

View File

@@ -85,7 +85,7 @@ Some examples of databases that work like this could be **PostgreSQL**, **MySQL*
### Distributed servers
In some cases, the database could even be a group server applications running on different machines, working together and communicating between them to be more efficient and handle more data.
In some cases, the database could even be a group of server applications running on different machines, working together and communicating between them to be more efficient and handle more data.
In this case, your code would talk to one or more of these server applications running on different machines.
@@ -250,7 +250,7 @@ As these **primary key** IDs can uniquely identify each row on the table for tea
<img alt="table relationships" src="/img/databases/relationships.svg">
So, in the table for heroes, we use the `team_id` column to define a relationship to the *foreign* table for teams. Each value in the `team_id` column on the table with heroes will be the same value as the `id` column of one row in the table wiwth teams.
So, in the table for heroes, we use the `team_id` column to define a relationship to the *foreign* table for teams. Each value in the `team_id` column on the table with heroes will be the same value as the `id` column of one row in the table with teams.
In the table for heroes we have a **primary key** that is the `id`. But we also have another column `team_id` that refers to a **key** in a **foreign** table. There's a technical term for that too, the `team_id` is a "**foreign key**".

View File

@@ -0,0 +1,97 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1463" dy="1403" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="950" width="1040" height="160" as="geometry"/>
</mxCell>
<mxCell id="39" value="&lt;font style=&quot;font-size: 24px&quot;&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="40" value="&lt;font style=&quot;font-size: 24px&quot;&gt;B&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="140" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="41" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="180" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="220" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;font style=&quot;font-size: 24px&quot;&gt;E&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="260" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="44" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="300" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;font style=&quot;font-size: 24px&quot;&gt;G&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="340" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;font style=&quot;font-size: 24px&quot;&gt;H&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="380" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;font style=&quot;font-size: 24px&quot;&gt;I&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="420" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;font style=&quot;font-size: 24px&quot;&gt;J&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="460" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;font style=&quot;font-size: 24px&quot;&gt;K&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="500" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;font style=&quot;font-size: 24px&quot;&gt;L&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="540" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="580" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;font style=&quot;font-size: 24px&quot;&gt;N&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="620" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;font style=&quot;font-size: 24px&quot;&gt;O&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="660" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="54" value="&lt;font style=&quot;font-size: 24px&quot;&gt;P&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="700" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="55" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Q&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="740" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;font-size: 24px&quot;&gt;R&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="780" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="57" value="&lt;font style=&quot;font-size: 24px&quot;&gt;S&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="820" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="&lt;font style=&quot;font-size: 24px&quot;&gt;T&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="860" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="59" value="&lt;font style=&quot;font-size: 24px&quot;&gt;U&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="900" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="60" value="&lt;font style=&quot;font-size: 24px&quot;&gt;V&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="940" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="61" value="&lt;font style=&quot;font-size: 24px&quot;&gt;W&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="980" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="62" value="&lt;font style=&quot;font-size: 24px&quot;&gt;X&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="1020" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="63" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Y&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="1060" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="64" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Z&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="1100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Dictionary&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="565" y="960" width="110" height="30" as="geometry"/>
</mxCell>
<mxCell id="68" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="580" y="1030" width="40" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 30 KiB

View File

@@ -0,0 +1,97 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1707" dy="1637" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="950" width="1040" height="160" as="geometry"/>
</mxCell>
<mxCell id="39" value="&lt;font style=&quot;font-size: 24px&quot;&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="40" value="&lt;font style=&quot;font-size: 24px&quot;&gt;B&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="140" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="41" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="180" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeWidth=3;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="220" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;font style=&quot;font-size: 24px&quot;&gt;E&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="260" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="44" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="300" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;font style=&quot;font-size: 24px&quot;&gt;G&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="340" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;font style=&quot;font-size: 24px&quot;&gt;H&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="380" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;font style=&quot;font-size: 24px&quot;&gt;I&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="420" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;font style=&quot;font-size: 24px&quot;&gt;J&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="460" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;font style=&quot;font-size: 24px&quot;&gt;K&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="500" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;font style=&quot;font-size: 24px&quot;&gt;L&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="540" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="580" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;font style=&quot;font-size: 24px&quot;&gt;N&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="620" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;font style=&quot;font-size: 24px&quot;&gt;O&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="660" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="54" value="&lt;font style=&quot;font-size: 24px&quot;&gt;P&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="700" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="55" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Q&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="740" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;font-size: 24px&quot;&gt;R&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="780" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="57" value="&lt;font style=&quot;font-size: 24px&quot;&gt;S&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="820" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="&lt;font style=&quot;font-size: 24px&quot;&gt;T&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="860" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="59" value="&lt;font style=&quot;font-size: 24px&quot;&gt;U&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="900" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="60" value="&lt;font style=&quot;font-size: 24px&quot;&gt;V&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="940" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="61" value="&lt;font style=&quot;font-size: 24px&quot;&gt;W&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="980" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="62" value="&lt;font style=&quot;font-size: 24px&quot;&gt;X&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1020" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="63" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Y&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1060" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="64" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Z&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Dictionary&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="565" y="960" width="110" height="30" as="geometry"/>
</mxCell>
<mxCell id="68" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="580" y="1030" width="40" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,97 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1205" dy="1155" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="950" width="1040" height="160" as="geometry"/>
</mxCell>
<mxCell id="39" value="&lt;font style=&quot;font-size: 24px&quot;&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="40" value="&lt;font style=&quot;font-size: 24px&quot;&gt;B&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="140" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="41" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="180" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeWidth=3;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="220" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;font style=&quot;font-size: 24px&quot;&gt;E&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="260" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="44" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="300" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;font style=&quot;font-size: 24px&quot;&gt;G&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="340" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;font style=&quot;font-size: 24px&quot;&gt;H&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="380" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;font style=&quot;font-size: 24px&quot;&gt;I&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="420" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;font style=&quot;font-size: 24px&quot;&gt;J&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="460" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;font style=&quot;font-size: 24px&quot;&gt;K&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="500" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;font style=&quot;font-size: 24px&quot;&gt;L&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="540" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="580" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;font style=&quot;font-size: 24px&quot;&gt;N&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="620" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;font style=&quot;font-size: 24px&quot;&gt;O&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="660" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="54" value="&lt;font style=&quot;font-size: 24px&quot;&gt;P&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="700" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="55" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Q&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="740" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;font-size: 24px&quot;&gt;R&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="780" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="57" value="&lt;font style=&quot;font-size: 24px&quot;&gt;S&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="820" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="&lt;font style=&quot;font-size: 24px&quot;&gt;T&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="860" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="59" value="&lt;font style=&quot;font-size: 24px&quot;&gt;U&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="900" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="60" value="&lt;font style=&quot;font-size: 24px&quot;&gt;V&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="940" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="61" value="&lt;font style=&quot;font-size: 24px&quot;&gt;W&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="980" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="62" value="&lt;font style=&quot;font-size: 24px&quot;&gt;X&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1020" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="63" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Y&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1060" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="64" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Z&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Dictionary&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="565" y="960" width="110" height="30" as="geometry"/>
</mxCell>
<mxCell id="69" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeWidth=3;strokeColor=#666666;fontColor=#333333;" vertex="1" parent="1">
<mxGeometry x="580" y="1030" width="560" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,100 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1463" dy="1403" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="950" width="1040" height="160" as="geometry"/>
</mxCell>
<mxCell id="39" value="&lt;font style=&quot;font-size: 24px&quot;&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="40" value="&lt;font style=&quot;font-size: 24px&quot;&gt;B&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="140" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="41" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="180" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="220" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;font style=&quot;font-size: 24px&quot;&gt;E&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="260" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="44" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="300" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;font style=&quot;font-size: 24px&quot;&gt;G&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="340" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;font style=&quot;font-size: 24px&quot;&gt;H&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="380" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;font style=&quot;font-size: 24px&quot;&gt;I&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="420" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;font style=&quot;font-size: 24px&quot;&gt;J&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="460" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;font style=&quot;font-size: 24px&quot;&gt;K&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="500" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;font style=&quot;font-size: 24px&quot;&gt;L&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="540" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="580" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;font style=&quot;font-size: 24px&quot;&gt;N&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="620" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;font style=&quot;font-size: 24px&quot;&gt;O&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="660" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="54" value="&lt;font style=&quot;font-size: 24px&quot;&gt;P&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="700" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="55" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Q&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="740" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;font-size: 24px&quot;&gt;R&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="780" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="57" value="&lt;font style=&quot;font-size: 24px&quot;&gt;S&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="820" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="&lt;font style=&quot;font-size: 24px&quot;&gt;T&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="860" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="59" value="&lt;font style=&quot;font-size: 24px&quot;&gt;U&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="900" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="60" value="&lt;font style=&quot;font-size: 24px&quot;&gt;V&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="940" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="61" value="&lt;font style=&quot;font-size: 24px&quot;&gt;W&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="980" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="62" value="&lt;font style=&quot;font-size: 24px&quot;&gt;X&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1020" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="63" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Y&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1060" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="64" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Z&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Dictionary&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="565" y="960" width="110" height="30" as="geometry"/>
</mxCell>
<mxCell id="68" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="300" y="1030" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="69" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeWidth=3;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1">
<mxGeometry x="580" y="1030" width="560" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,97 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1024" dy="982" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="950" width="1040" height="160" as="geometry"/>
</mxCell>
<mxCell id="39" value="&lt;font style=&quot;font-size: 24px&quot;&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="40" value="&lt;font style=&quot;font-size: 24px&quot;&gt;B&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="140" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="41" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="180" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeWidth=3;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="220" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;font style=&quot;font-size: 24px&quot;&gt;E&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="260" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="44" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="300" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;font style=&quot;font-size: 24px&quot;&gt;G&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="340" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;font style=&quot;font-size: 24px&quot;&gt;H&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="380" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;font style=&quot;font-size: 24px&quot;&gt;I&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="420" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;font style=&quot;font-size: 24px&quot;&gt;J&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="460" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;font style=&quot;font-size: 24px&quot;&gt;K&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="500" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;font style=&quot;font-size: 24px&quot;&gt;L&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="540" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="580" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;font style=&quot;font-size: 24px&quot;&gt;N&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="620" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;font style=&quot;font-size: 24px&quot;&gt;O&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="660" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="54" value="&lt;font style=&quot;font-size: 24px&quot;&gt;P&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="700" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="55" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Q&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="740" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;font-size: 24px&quot;&gt;R&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="780" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="57" value="&lt;font style=&quot;font-size: 24px&quot;&gt;S&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="820" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="&lt;font style=&quot;font-size: 24px&quot;&gt;T&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="860" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="59" value="&lt;font style=&quot;font-size: 24px&quot;&gt;U&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="900" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="60" value="&lt;font style=&quot;font-size: 24px&quot;&gt;V&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="940" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="61" value="&lt;font style=&quot;font-size: 24px&quot;&gt;W&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="980" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="62" value="&lt;font style=&quot;font-size: 24px&quot;&gt;X&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1020" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="63" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Y&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1060" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="64" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Z&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Dictionary&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="565" y="960" width="110" height="30" as="geometry"/>
</mxCell>
<mxCell id="69" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeWidth=3;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1">
<mxGeometry x="300" y="1030" width="840" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,100 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1024" dy="982" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="950" width="1040" height="160" as="geometry"/>
</mxCell>
<mxCell id="39" value="&lt;font style=&quot;font-size: 24px&quot;&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="40" value="&lt;font style=&quot;font-size: 24px&quot;&gt;B&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="140" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="41" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="180" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="220" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;font style=&quot;font-size: 24px&quot;&gt;E&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="260" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="44" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="300" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;font style=&quot;font-size: 24px&quot;&gt;G&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="340" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;font style=&quot;font-size: 24px&quot;&gt;H&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="380" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;font style=&quot;font-size: 24px&quot;&gt;I&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="420" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;font style=&quot;font-size: 24px&quot;&gt;J&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="460" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;font style=&quot;font-size: 24px&quot;&gt;K&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="500" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;font style=&quot;font-size: 24px&quot;&gt;L&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="540" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="580" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;font style=&quot;font-size: 24px&quot;&gt;N&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="620" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;font style=&quot;font-size: 24px&quot;&gt;O&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="660" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="54" value="&lt;font style=&quot;font-size: 24px&quot;&gt;P&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="700" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="55" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Q&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="740" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;font-size: 24px&quot;&gt;R&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="780" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="57" value="&lt;font style=&quot;font-size: 24px&quot;&gt;S&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="820" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="&lt;font style=&quot;font-size: 24px&quot;&gt;T&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="860" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="59" value="&lt;font style=&quot;font-size: 24px&quot;&gt;U&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="900" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="60" value="&lt;font style=&quot;font-size: 24px&quot;&gt;V&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="940" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="61" value="&lt;font style=&quot;font-size: 24px&quot;&gt;W&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="980" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="62" value="&lt;font style=&quot;font-size: 24px&quot;&gt;X&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1020" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="63" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Y&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1060" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="64" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Z&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Dictionary&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="565" y="960" width="110" height="30" as="geometry"/>
</mxCell>
<mxCell id="69" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeWidth=3;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1">
<mxGeometry x="300" y="1030" width="840" height="80" as="geometry"/>
</mxCell>
<mxCell id="70" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="180" y="1030" width="40" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,100 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1024" dy="982" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="950" width="1040" height="160" as="geometry"/>
</mxCell>
<mxCell id="39" value="&lt;font style=&quot;font-size: 24px&quot;&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="40" value="&lt;font style=&quot;font-size: 24px&quot;&gt;B&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="140" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="41" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" parent="1" vertex="1">
<mxGeometry x="180" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeWidth=3;strokeColor=#b85450;" parent="1" vertex="1">
<mxGeometry x="220" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;font style=&quot;font-size: 24px&quot;&gt;E&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="260" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="44" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="300" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;font style=&quot;font-size: 24px&quot;&gt;G&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="340" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;font style=&quot;font-size: 24px&quot;&gt;H&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="380" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;font style=&quot;font-size: 24px&quot;&gt;I&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="420" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;font style=&quot;font-size: 24px&quot;&gt;J&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="460" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;font style=&quot;font-size: 24px&quot;&gt;K&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="500" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;font style=&quot;font-size: 24px&quot;&gt;L&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="540" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="580" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;font style=&quot;font-size: 24px&quot;&gt;N&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="620" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;font style=&quot;font-size: 24px&quot;&gt;O&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="660" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="54" value="&lt;font style=&quot;font-size: 24px&quot;&gt;P&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="700" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="55" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Q&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="740" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;font-size: 24px&quot;&gt;R&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="780" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="57" value="&lt;font style=&quot;font-size: 24px&quot;&gt;S&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="820" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="&lt;font style=&quot;font-size: 24px&quot;&gt;T&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="860" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="59" value="&lt;font style=&quot;font-size: 24px&quot;&gt;U&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="900" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="60" value="&lt;font style=&quot;font-size: 24px&quot;&gt;V&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="940" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="61" value="&lt;font style=&quot;font-size: 24px&quot;&gt;W&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="980" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="62" value="&lt;font style=&quot;font-size: 24px&quot;&gt;X&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1020" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="63" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Y&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1060" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="64" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Z&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Dictionary&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="565" y="960" width="110" height="30" as="geometry"/>
</mxCell>
<mxCell id="69" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeWidth=3;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1">
<mxGeometry x="300" y="1030" width="840" height="80" as="geometry"/>
</mxCell>
<mxCell id="71" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeWidth=3;strokeColor=#666666;fontColor=#333333;" vertex="1" parent="1">
<mxGeometry x="100" y="1030" width="120" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,103 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1024" dy="982" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="950" width="1040" height="160" as="geometry"/>
</mxCell>
<mxCell id="39" value="&lt;font style=&quot;font-size: 24px&quot;&gt;A&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="40" value="&lt;font style=&quot;font-size: 24px&quot;&gt;B&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="140" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="41" value="&lt;font style=&quot;font-size: 24px&quot;&gt;C&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="180" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeWidth=3;strokeColor=#82b366;" parent="1" vertex="1">
<mxGeometry x="220" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="43" value="&lt;font style=&quot;font-size: 24px&quot;&gt;E&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="260" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="44" value="&lt;font style=&quot;font-size: 24px&quot;&gt;F&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="300" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="45" value="&lt;font style=&quot;font-size: 24px&quot;&gt;G&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="340" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="46" value="&lt;font style=&quot;font-size: 24px&quot;&gt;H&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="380" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="47" value="&lt;font style=&quot;font-size: 24px&quot;&gt;I&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="420" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="48" value="&lt;font style=&quot;font-size: 24px&quot;&gt;J&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="460" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="49" value="&lt;font style=&quot;font-size: 24px&quot;&gt;K&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="500" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="50" value="&lt;font style=&quot;font-size: 24px&quot;&gt;L&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="540" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="51" value="&lt;font style=&quot;font-size: 24px&quot;&gt;M&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="580" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="52" value="&lt;font style=&quot;font-size: 24px&quot;&gt;N&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="620" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="53" value="&lt;font style=&quot;font-size: 24px&quot;&gt;O&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="660" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="54" value="&lt;font style=&quot;font-size: 24px&quot;&gt;P&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="700" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="55" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Q&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="740" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="56" value="&lt;font style=&quot;font-size: 24px&quot;&gt;R&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="780" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="57" value="&lt;font style=&quot;font-size: 24px&quot;&gt;S&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="820" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="58" value="&lt;font style=&quot;font-size: 24px&quot;&gt;T&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="860" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="59" value="&lt;font style=&quot;font-size: 24px&quot;&gt;U&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="900" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="60" value="&lt;font style=&quot;font-size: 24px&quot;&gt;V&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="940" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="61" value="&lt;font style=&quot;font-size: 24px&quot;&gt;W&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="980" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="62" value="&lt;font style=&quot;font-size: 24px&quot;&gt;X&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1020" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="63" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Y&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1060" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="64" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Z&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="1100" y="840" width="40" height="80" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Dictionary&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="565" y="960" width="110" height="30" as="geometry"/>
</mxCell>
<mxCell id="69" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeWidth=3;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1">
<mxGeometry x="260" y="1030" width="880" height="80" as="geometry"/>
</mxCell>
<mxCell id="71" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeWidth=3;strokeColor=#666666;fontColor=#333333;" parent="1" vertex="1">
<mxGeometry x="100" y="1030" width="120" height="80" as="geometry"/>
</mxCell>
<mxCell id="72" value="&lt;font style=&quot;font-size: 24px&quot;&gt;D&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeWidth=3;strokeColor=#82b366;" vertex="1" parent="1">
<mxGeometry x="220" y="1030" width="40" height="80" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

View File

@@ -0,0 +1,92 @@
<mxfile host="65bd71144e">
<diagram id="objTApYHlBqCKos3M7rL" name="Page-1">
<mxGraphModel dx="1707" dy="1637" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1920" pageHeight="1200" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="4" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#FFFFFF;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="80" y="420" width="1020" height="490" as="geometry"/>
</mxCell>
<mxCell id="66" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Technical Book&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1">
<mxGeometry x="492.5" y="440" width="195" height="30" as="geometry"/>
</mxCell>
<mxCell id="77" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Chapter 1&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="100" y="490" width="140" height="90" as="geometry"/>
</mxCell>
<mxCell id="83" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Chapter 2&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="240" y="490" width="140" height="90" as="geometry"/>
</mxCell>
<mxCell id="84" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Chapter 3&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="380" y="490" width="140" height="90" as="geometry"/>
</mxCell>
<mxCell id="85" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Chapter 4&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="520" y="490" width="140" height="90" as="geometry"/>
</mxCell>
<mxCell id="86" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Chapter 5&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="660" y="490" width="140" height="90" as="geometry"/>
</mxCell>
<mxCell id="87" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Chapter 6&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="800" y="490" width="140" height="90" as="geometry"/>
</mxCell>
<mxCell id="88" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Chapter 7&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;fillColor=#dae8fc;strokeColor=#6c8ebf;" vertex="1" parent="1">
<mxGeometry x="940" y="490" width="140" height="90" as="geometry"/>
</mxCell>
<mxCell id="74" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeWidth=3;strokeColor=#d6b656;" vertex="1" parent="1">
<mxGeometry x="100" y="580" width="980" height="310" as="geometry"/>
</mxCell>
<mxCell id="75" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Book Index&lt;/font&gt;" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1">
<mxGeometry x="498.125" y="840" width="183.75" height="30" as="geometry"/>
</mxCell>
<mxCell id="89" style="edgeStyle=orthogonalEdgeStyle;html=1;strokeWidth=3;" edge="1" parent="1" source="42" target="77">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="92" style="edgeStyle=orthogonalEdgeStyle;html=1;strokeWidth=3;" edge="1" parent="1" source="42" target="86">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="42" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Database&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" parent="1" vertex="1">
<mxGeometry x="119.99615384615385" y="690" width="150.76923076923077" height="70" as="geometry"/>
</mxCell>
<mxCell id="94" style="edgeStyle=orthogonalEdgeStyle;html=1;strokeWidth=3;" edge="1" parent="1" source="93" target="83">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="330" y="820"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="95" style="edgeStyle=orthogonalEdgeStyle;html=1;strokeWidth=3;" edge="1" parent="1" source="93" target="85">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="590" y="800"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="93" value="&lt;font style=&quot;font-size: 24px&quot;&gt;Python&lt;/font&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="909.9961538461539" y="780" width="150.76923076923077" height="70" as="geometry"/>
</mxCell>
<mxCell id="97" style="edgeStyle=orthogonalEdgeStyle;html=1;strokeWidth=3;" edge="1" parent="1" source="96" target="87">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="98" style="edgeStyle=orthogonalEdgeStyle;html=1;strokeWidth=3;" edge="1" parent="1" source="96" target="86">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="770" y="725"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="96" value="&lt;span style=&quot;font-size: 24px&quot;&gt;Files&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="909.9961538461539" y="690" width="150.76923076923077" height="70" as="geometry"/>
</mxCell>
<mxCell id="100" style="edgeStyle=orthogonalEdgeStyle;html=1;strokeWidth=3;" edge="1" parent="1" source="99" target="84">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="450" y="800"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="99" value="&lt;span style=&quot;font-size: 24px&quot;&gt;Editors&lt;/span&gt;" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=3;" vertex="1" parent="1">
<mxGeometry x="119.9961538461539" y="780" width="150.76923076923077" height="70" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -212,4 +212,4 @@ And at the same time, ✨ it is also a **Pydantic** model ✨. You can use inher
## License
This project is licensed under the terms of the MIT license.
This project is licensed under the terms of the [MIT license](https://github.com/tiangolo/sqlmodel/blob/main/LICENSE).

View File

@@ -3,6 +3,103 @@
## Latest Changes
## 0.0.6
### Breaking Changes
**SQLModel** no longer creates indexes by default for every column, indexes are now opt-in. You can read more about it in PR [#205](https://github.com/tiangolo/sqlmodel/pull/205).
Before this change, if you had a model like this:
```Python
from typing import Optional
from sqlmodel import Field, SQLModel
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
secret_name: str
age: Optional[int] = None
```
...when creating the tables, SQLModel version `0.0.5` and below, would also create an index for `name`, one for `secret_name`, and one for `age` (`id` is the primary key, so it doesn't need an additional index).
If you depended on having an index for each one of those columns, now you can (and would have to) define them explicitly:
```Python
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str = Field(index=True)
age: Optional[int] = Field(default=None, index=True)
```
There's a high chance you don't need indexes for all the columns. For example, you might only need indexes for `name` and `age`, but not for `secret_name`. In that case, you could define the model as:
```Python
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
```
If you already created your database tables with SQLModel using versions `0.0.5` or below, it would have also created those indexes in the database. In that case, you might want to manually drop (remove) some of those indexes, if they are unnecessary, to avoid the extra cost in performance and space.
Depending on the database you are using, there will be a different way to find the available indexes.
For example, let's say you no longer need the index for `secret_name`. You could check the current indexes in the database and find the one for `secret_name`, it could be named `ix_hero_secret_name`. Then you can remove it with SQL:
```SQL
DROP INDEX ix_hero_secret_name
```
or
```SQL
DROP INDEX ix_hero_secret_name ON hero;
```
Here's the new, extensive documentation explaining indexes and how to use them: [Indexes - Optimize Queries](https://sqlmodel.tiangolo.com/tutorial/indexes/).
### Docs
* ✨ Document indexes and make them opt-in. Here's the new documentation: [Indexes - Optimize Queries](https://sqlmodel.tiangolo.com/tutorial/indexes/). This is the same change described above in **Breaking Changes**. PR [#205](https://github.com/tiangolo/sqlmodel/pull/205) by [@tiangolo](https://github.com/tiangolo).
* ✏ Fix typo in FastAPI tutorial. PR [#192](https://github.com/tiangolo/sqlmodel/pull/192) by [@yaquelinehoyos](https://github.com/yaquelinehoyos).
* 📝 Add links to the license file. PR [#29](https://github.com/tiangolo/sqlmodel/pull/29) by [@sobolevn](https://github.com/sobolevn).
* ✏ Fix typos in docs titles. PR [#28](https://github.com/tiangolo/sqlmodel/pull/28) by [@Batalex](https://github.com/Batalex).
* ✏ Fix multiple typos and some rewording. PR [#22](https://github.com/tiangolo/sqlmodel/pull/22) by [@egrim](https://github.com/egrim).
* ✏ Fix typo in `docs/tutorial/automatic-id-none-refresh.md`. PR [#14](https://github.com/tiangolo/sqlmodel/pull/14) by [@leynier](https://github.com/leynier).
* ✏ Fix typos in `docs/tutorial/index.md` and `docs/databases.md`. PR [#5](https://github.com/tiangolo/sqlmodel/pull/5) by [@sebastianmarines](https://github.com/sebastianmarines).
## 0.0.5
### Features
* ✨ Add support for Decimal fields from Pydantic and SQLAlchemy. Original PR [#103](https://github.com/tiangolo/sqlmodel/pull/103) by [@robcxyz](https://github.com/robcxyz). New docs: [Advanced User Guide - Decimal Numbers](https://sqlmodel.tiangolo.com/advanced/decimal/).
### Docs
* ✏ Update decimal tutorial source for consistency. PR [#188](https://github.com/tiangolo/sqlmodel/pull/188) by [@tiangolo](https://github.com/tiangolo).
### Internal
* 🔧 Split MkDocs insiders build in CI to support building from PRs. PR [#186](https://github.com/tiangolo/sqlmodel/pull/186) by [@tiangolo](https://github.com/tiangolo).
* 🎨 Format `expression.py` and expression template, currently needed by CI. PR [#187](https://github.com/tiangolo/sqlmodel/pull/187) by [@tiangolo](https://github.com/tiangolo).
* 🐛Fix docs light/dark theme switcher. PR [#1](https://github.com/tiangolo/sqlmodel/pull/1) by [@Lehoczky](https://github.com/Lehoczky).
* 🔧 Add MkDocs Material social cards. PR [#90](https://github.com/tiangolo/sqlmodel/pull/90) by [@tiangolo](https://github.com/tiangolo).
* ✨ Update type annotations and upgrade mypy. PR [#173](https://github.com/tiangolo/sqlmodel/pull/173) by [@tiangolo](https://github.com/tiangolo).
## 0.0.4
* 🎨 Fix type detection of select results in PyCharm. PR [#15](https://github.com/tiangolo/sqlmodel/pull/15) by [@tiangolo](https://github.com/tiangolo).
## 0.0.3
* ⬆️ Update and relax specification range for `sqlalchemy-stubs`. PR [#4](https://github.com/tiangolo/sqlmodel/pull/4) by [@tiangolo](https://github.com/tiangolo).
## 0.0.2
* This includes several small bug fixes detected during the first CI runs.

View File

@@ -399,7 +399,7 @@ In this case, after committing the object to the database with the **session**,
## Print Data After Closing the Session
Now, as a fnal experiment, we can also print data after the **session** is closed.
Now, as a final experiment, we can also print data after the **session** is closed.
There are no surprises here, it still works:

View File

@@ -78,6 +78,7 @@ The `Team` model will be in a table automatically named `"team"`, and it will ha
* `id`, the primary key, automatically generated by the database
* `name`, the name of the team
* We also tell **SQLModel** to create an index for this column
* `headquarters`, the headquarters of the team
And finally we mark it as a table in the config.
@@ -107,7 +108,7 @@ Most of that should look familiar:
The column will be named `team_id`. It will be an integer, and it could be `NULL` in the database (or `None` in Python), becase there could be some heroes that don't belong to any team.
As we don't have to explicitly pass `team_id=None` when creating a hero, we add a default of `None` to the `Field()`.
We add a default of `None` to the `Field()` so we don't have to explicitly pass `team_id=None` when creating a hero.
Now, here's the new part:

View File

@@ -1,4 +1,4 @@
# Read Heroes with Limit and Offset wtih FastAPI
# Read Heroes with Limit and Offset with FastAPI
When a client sends a request to get all the heroes, we have been returning them all.

View File

@@ -305,6 +305,31 @@ And of course, all these fields will be in the columns for the resulting `hero`
And those inherited fields will also be in the **autocompletion** and **inline errors** in editors, etc.
### Columns and Inheritance with Multiple Models
Notice that the parent model `HeroBase` is not a **table model**, but still, we can declare `name` and `age` using `Field(index=True)`.
```Python hl_lines="4 6 9"
# Code above omitted 👆
{!./docs_src/tutorial/fastapi/multiple_models/tutorial002.py[ln:7-14]!}
# Code below omitted 👇
```
<details>
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/tutorial/fastapi/multiple_models/tutorial002.py!}
```
</details>
This won't affect this parent **data model** `HeroBase`.
But once the child model `Hero` (the actual **table model**) inherits those fields, it will use those field configurations to create the indexes when creating the tables in the database.
### The `HeroCreate` **Data Model**
Now let's see the `HeroCreate` model that will be used to define the data that we want to receive in the API when creating a new hero.

View File

@@ -152,7 +152,7 @@ It will be called when a user sends a request with a `POST` **operation** to the
## The **SQLModel** Advantage
Here's where having our **SQLModel** class models be both **SQLAlchemy** models and **Pydantic** models at the same tieme shine. ✨
Here's where having our **SQLModel** class models be both **SQLAlchemy** models and **Pydantic** models at the same time shine. ✨
Here we use the **same** class model to define the **request body** that will be received by our API.

View File

@@ -1,4 +1,4 @@
# FastAPI Path Opeartions for Teams - Other Models
# FastAPI Path Operations for Teams - Other Models
Let's now update the **FastAPI** application to handle data for teams.

View File

@@ -97,7 +97,7 @@ $ python3 --version
// This is too old! 😱
Python 3.5.6
// Let's see if python3.10 is available
$ python3.10 --verson
$ python3.10 --version
// Oh, no, this one is not available 😔
command not found: python3.10
$ python3.9 --version

406
docs/tutorial/indexes.md Normal file
View File

@@ -0,0 +1,406 @@
# Indexes - Optimize Queries
We just saw how to get some data `WHERE` a **condition** is true. For example, where the hero **name is "Deadpond"**.
If we just create the tables and the data as we have been doing, when we `SELECT` some data using `WHERE`, the database would have to **scan** through **each one of the records** to find the ones that **match**. This is not a problem with 3 heroes as in these examples.
But imagine that your database has **thousands** or **millions** of **records**, if every time you want to find the heroes with the name "Deadpond" it has to scan through **all** of the records to find all the possible matches, then that becomes problematic, as it would be too slow.
I'll show you how to handle it with a database **index**.
The change in the code is **extremely small**, but it's useful to understand what's happening behind the scenes, so I'll show you **how it all works** and what it means.
---
If you already executed the previous examples and have a database with data, **remove the database file** before running each example, that way you won't have duplicate data and you will be able to get the same results.
## No Time to Explain
Are you already a **SQL expert** and don't have time for all my explanations?
Fine, in that case, you can **sneak peek** the final code to create indexes here.
<details>
<summary>👀 Full file preview</summary>
```Python hl_lines="8 10"
{!./docs_src/tutorial/indexes/tutorial002.py!}
```
</details>
..but if you are not an expert, **continue reading**, this will probably be useful. 🤓
## What is an Index
In general, an **index** is just something we can have to help us **find things faster**. It normally works by having things in **order**. Let's think about some real-life examples before even thinking about databases and code.
### An Index and a Dictionary
Imagine a **dictionary**, a book with definitions of words. 📔 ...not a Python `dict`. 😅
Let's say that you want to **find a word**, for example the word "**database**". You take the dictionary, and open it somewhere, for example in the middle. Maybe you see some definitions of words that start with `m`, like `manual`, so you conclude that you are in the letter `m` in the dictionary.
<img src="/img/tutorial/indexes/dictionary001.svg">
You know that in the alphabet, the letter `d` for `database` comes **before** the letter `m` for `manual`.
<img src="/img/tutorial/indexes/dictionary002.svg">
So, you know you have to search in the dictionary **before** the point you currently are. You still don't know where the word `database` is, because you don't know exactly where the letter `d` is in the dictionary, but you know that **it is not after** that point, you can now **discard the right half** of the dictionary in your search.
<img src="/img/tutorial/indexes/dictionary003.svg">
Next, you **open the dictionary again**, but only taking into account the **half of the dictionary** that can contain the word you want, the **left part of the dictionary**. You open it in the middle of that left part and now you arrive maybe at the letter `f`.
<img src="/img/tutorial/indexes/dictionary004.svg">
You know that `d` from `database` comes before `f`. So it has to be **before** that. But now you know that `database` **is not after** that point, and you can discard the dictionary from that point onward.
<img src="/img/tutorial/indexes/dictionary005.svg">
Now you have a **small section of dictionary** to search (only a **quarter** of dictionary can have your word). You take that **quarter** of the pages at the start of the dictionary that can contain your word, and open it in the middle of that section. Maybe you arrive at the letter `c`.
<img src="/img/tutorial/indexes/dictionary006.svg">
You know the word `database` has to be **after** that and **not before** that point, so you can discard the left part of that block of pages.
<img src="/img/tutorial/indexes/dictionary007.svg">
You repeat this process **a few more times**, and you finally arrive at the letter `d`, you continue with the same process in that section for the letter `d` and you finally **find the word** `database`. 🎉
<img src="/img/tutorial/indexes/dictionary008.svg">
You had to open the dictionary a few times, maybe **5 or 10**. That's actually **very little work** compared to what it could have been.
!!! note "Technical Details"
Do you like **fancy words**? Cool! Programmers tend to like fancy words. 😅
That <abbr title="a recipe, a sequence of predefined steps that achieve a result">algorithm</abbr> I showed you above is called **Binary Search**.
It's called like that because you **search** something by splitting the dictionary (or any ordered list of things) in **two** ("binary" means "two") parts. And you do that process multiple times until you find what you want.
### An Index and a Novel
Let's now imagine you are reading a **novel book**. And someone told you that at some point, they mention a **database**, and you want to find that chapter.
How do you find the word "*database*" there? You might have to read **the entire book** to find where the word "*database*" is located in the book. So, instead of opening the book 5 or 10 times, you would have to open each of the **500 pages** and read them one by one until you find the word. You might enjoy the book, though. 😅
But if we are only interested in **quickly finding information** (as when working with SQL databases), then reading each of the 500 pages is **too inefficient** when there could be an option to open the book in 5 or 10 places and find what you're looking for.
### A Technical Book with an Index
Now let's imagine you are reading a technical book. For example, with several topics about programming. And there's a couple of sections where it talks about a **database**.
This book might have a **book index**: a section in the book that has some **names of topics covered** and the **page numbers** in the book where you can read about them. And the topic names are **sorted** in alphabetic order, pretty much like a dictionary (a book with words, as in the previous example).
In this case, you can open that book in the end (or in the beginning) to find the **book index** section, it would have only a few pages. And then, you can do the same process as with the **dictionary** example above.
Open the index, and after **5 or 10 steps**, quickly find the topic "**database**" with the page numbers where that is covered, for example "page 253 in Chapter 5". Now you used the dictionary technique to find the **topic**, and that topic gave you a **page number**.
Now you know that you need to find "**page 253**". But by looking at the closed book you still don't know where that page is, so you have to **find that page**. To find it, you can do the same process again, but this time, instead of searching for a **topic** in the **index**, you are searching for a **page number** in the **entire book**. And after **5 or 10 more steps**, you find the page 253 in Chapter 5.
<img src="/img/tutorial/indexes/techbook001.svg">
After this, even though this book is not a dictionary and has some particular content, you were able to **find the section** in the book that talks about a "**database**" in a **few steps** (say 10 or 20, instead of reading all the 500 pages).
The main point is that the index is **sorted**, so we can use the same process we used for the **dictionary** to find the topic. And then that gives us a page number, and the **page numbers are also sorted**! 😅
When we have a list of sorted things we can apply the same technique, and that's the whole trick here, we use the same technique first for the **topics** in the index and then for the **page numbers** to find the actual chapter.
Such efficiency! 😎
## What are Database Indexes
**Database indexes** are very similar to **book indexes**.
Database indexes store some info, some keys, in a way that makes it **easy and fast to find** (for example sorted), and then for each key they **point to some data somewhere else** in the database.
Let's see a more clear example. Let's say you have this table in a database:
<table>
<tr>
<th>id</th><th>name</th><th>secret_name</th><th>age</th>
</tr>
<tr>
<td>1</td><td>Deadpond</td><td>Dive Wilson</td><td>null</td>
</tr>
<tr>
<td>2</td><td>Spider-Boy</td><td>Pedro Parqueador</td><td>null</td>
</tr>
<tr>
<td>3</td><td>Rusty-Man</td><td>Tommy Sharp</td><td>48</td>
</tr>
</table>
And let's imagine you have **many more rows**, many more heroes. Probably **thousands**.
If you tell the SQL database to get you a hero by a specific name, for example `Spider-Boy` (by using the `name` in the `WHERE` part of the SQL query), the database will have to **scan** all the heroes, checking **one by one** to find all the ones with a name of `Spider-Boy`.
In this case, there's only one, but there's nothing limiting the database from having **more records with the same name**. And because of that, the database would **continue searching** and checking each one of the records, which would be very slow.
But now let's say that the database has an index for the column `name`. The index could look something like this, we could imagine that the index is like an additional special table that the database manages automatically:
<table>
<tr>
<th>name</th><th>id</th>
</tr>
<tr>
<td>Deadpond</td><td>1</td>
</tr>
<tr>
<td>Rusty-Man</td><td>3</td>
</tr>
<tr>
<td>Spider-Boy</td><td>2</td>
</tr>
</table>
It would have each `name` field from the `hero` table **in order**. It would not be sorted by `id`, but by `name` (in alphabetical order, as the `name` is a string). So, first it would have `Deadpond`, then `Rusty-Man`, and last `Spider-Boy`. It would also include the `id` of each hero. Remember that this could have **thousands** of heroes.
Then the database would be able to use more or less the same ideas in the examples above with the **dictionary** and the **book index**.
It could start somewhere (for example, in the middle of the index). It could arrive at some hero there in the middle, like `Rusty-Man`. And because the **index** has the `name` fields in order, the database would know that it can **discard all the previous index rows** and **only search** in the following index rows.
<table>
<tr>
<th>name</th><th>id</th>
</tr>
<tr style="background-color: #F5F5F5; color: #999999;">
<td>Deadpond</td><td>1</td>
</tr>
<tr style="background-color: #F5F5F5; color: #999999;">
<td>Rusty-Man</td><td>3</td>
</tr>
<tr style="background-color: #FFF2CC;">
<td>Spider-Boy</td><td>2</td>
</tr>
</table>
And that way, as with the example with the dictionary above, **instead of reading thousands of heroes**, the database would be able to do a few steps, say **5 or 10 steps**, and arrive at the row of the index that has `Spider-Boy`, even if the table (and index) has thousands of rows:
<table>
<tr>
<th>name</th><th>id</th>
</tr>
<tr style="background-color: #F5F5F5; color: #999999;">
<td>Deadpond</td><td>1</td>
</tr>
<tr style="background-color: #F5F5F5; color: #999999;">
<td>Rusty-Man</td><td>3</td>
</tr>
<tr style="background-color: #D5E8D4;">
<td>✨ Spider-Boy ✨</td><td>2</td>
</tr>
</table>
Then by looking at **this index row**, it would know that the `id` for `Spider-Boy` in the `hero` table is `2`.
So then it could **search that `id`** in the `hero` table using more or less the **same technique**.
That way, in the end, instead of reading thousands of records, the database only had to do **a few steps** to find the hero we wanted.
## Updating the Index
As you can imagine, for all this to work, the index would need to be **up to date** with the data in the database.
If you had to update it **manually** in code, it would be very cumbersome and **error-prone**, as it would be easy to end up in a state where the index is not up to date and points to incorrect data. 😱
Here's the good news: when you create an index in a **SQL Database**, the database takes care of **updating** it **automatically** whenever it's necessary. 😎🎉
If you **add new records** to the `hero` table, the database will **automatically** update the index. It will do the **same process** of **finding** the right place to put the new index data (those **5 or 10 steps** described above), and then it will save the new index information there. The same would happen when you **update** or **delete** data.
Defining and creating an index is very **easy** with SQL databases. And then **using it** is even easier... it's transparent. The database will figure out which index to use automatically, the SQL queries don't even change.
So, in SQL databases **indexes are great**! And are super **easy to use**. Why not just have indexes for everything? .....Because indexes also have a "**cost**" in computation and storage (disk space).
## Index Cost
There's a **cost** associated with **indexes**. 💰
When you don't have an index and add a **new row** to the table `hero`, the database has to perform **1 operation** to add the new hero row at the end of the table.
But if you have an **index** for the **hero names**, now the database has to perform the same **1 operation** to add that row **plus** some extra **5 or 10 operations** in the index, to find the right spot for the name, to then add that **index record** there.
And if you have an index for the `name`, one for the `age`, and one for the `secret_name`, now the database has to perform the same **1 operation** to add that row **plus** some extra **5 or 10 operations** in the index **times 3**, for each of the indexes. This means that now adding one row takes something like **31 operations**.
This also means that you are **exchanging** the time it takes to **read** data for the time it takes to **write** data plus some extra **space** in the database.
If you have queries that get data out of the database comparing each one of those fields (for example using `WHERE`), then it makes total sense to have indexes for each one of them. Because **31 operations** while creating or updating data (plus the space of the index) is much, much better than the possible **500 or 1000 operations** to read all the rows to be able to compare them using each field.
But if you **never** have queries that find records by the `secret_name` (you never use `secret_name` in the `WHERE` part) it probably doesn't make sense to have an index for the `secret_name` field/column, as that will increase the computational and space **cost** of writing and updating the database.
## Create an Index with SQL
Phew, that was a lot of theory and explanations. 😅
The most important thing about indexes is **understanding** them, how, and when to use them.
Let's now see the **SQL** syntax to create an **index**. It is very simple:
```SQL hl_lines="3"
CREATE INDEX ix_hero_name
ON hero (name)
```
This means, more or less:
> Hey SQL database 👋, please `CREATE` an `INDEX` for me.
>
> I want the name of the index to be `ix_hero_name`.
>
> This index should be `ON` the table `hero`, it refers to that table.
>
> The column I want you to use for it is `name`.
## Declare Indexes with SQLModel
And now let's see how to define indexes in **SQLModel**.
The change in code is underwhelming, it's very simple. 😆
Here's the `Hero` model we had before:
```Python hl_lines="8"
{!./docs_src/tutorial/where/tutorial001.py[ln:1-10]!}
# Code below omitted 👇
```
<details>
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/tutorial/where/tutorial001.py!}
```
</details>
Let's now update it to tell **SQLModel** to create an index for the `name` field when creating the table:
```Python hl_lines="8"
{!./docs_src/tutorial/indexes/tutorial001.py[ln:1-10]!}
# Code below omitted 👇
```
<details>
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/tutorial/indexes/tutorial001.py!}
```
</details>
We use the same `Field()` again as we did before, and set `index=True`. That's it! 🚀
Notice that we didn't set an argument of `default=None` or anything similar. This means that **SQLModel** (thanks to Pydantic) will keep it as a **required** field.
!!! info
SQLModel (actually SQLAlchemy) will **automatically generate the index name** for you.
In this case the generated name would be `ix_hero_name`.
## Query Data
Now, to query the data using the field `name` and the new index we don't have to do anything special or different in the code, it's just **the same code**.
The SQL database will figure it out **automatically**. ✨
This is great because it means that indexes are very **simple to use**. But it might also feel counterintuitive at first, as you are **not doing anything** explicitly in the code to make it obvious that the index is useful, it all happens in the database behind the scenes.
```Python hl_lines="5"
# Code above omitted 👆
{!./docs_src/tutorial/indexes/tutorial001.py[ln:36-41]!}
# Code below omitted 👇
```
<details>
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/tutorial/indexes/tutorial001.py!}
```
</details>
This is exactly the same code as we had before, but now the database will **use the index** underneath.
## Run the Program
If you run the program now, you will see an output like this:
<div class="termy">
```console
$ python app.py
// Some boilerplate output omitted 😉
// Create the table
CREATE TABLE hero (
id INTEGER,
name VARCHAR NOT NULL,
secret_name VARCHAR NOT NULL,
age INTEGER,
PRIMARY KEY (id)
)
// Create the index 🤓🎉
CREATE INDEX ix_hero_name ON hero (name)
// The SELECT with WHERE looks the same
INFO Engine SELECT hero.id, hero.name, hero.secret_name, hero.age
FROM hero
WHERE hero.name = ?
INFO Engine [no key 0.00014s] ('Deadpond',)
// The resulting hero
secret_name='Dive Wilson' age=None id=1 name='Deadpond'
```
</div>
## More Indexes
We are going to query the `hero` table doing comparisons on the `age` field too, so we should **define an index** for that one as well:
```Python hl_lines="10"
{!./docs_src/tutorial/indexes/tutorial002.py[ln:1-10]!}
# Code below omitted 👇
```
<details>
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/tutorial/indexes/tutorial002.py!}
```
</details>
In this case, we want the default value of `age` to continue being `None`, so we set `default=None` when using `Field()`.
Now when we use **SQLModel** to create the database and tables, it will also create the **indexes** for these two columns in the `hero` table.
So, when we query the database for the `hero` table and use those **two columns** to define what data we get, the database will be able to **use those indexes** to improve the **reading performance**. 🚀
## Primary Key and Indexes
You probably noticed that we didn't set `index=True` for the `id` field.
Because the `id` is already the **primary key**, the database will automatically create an internal **index** for it.
The database always creates an internal index for **primary keys** automatically, as those are the primary way to organize, store, and retrieve data. 🤓
But if you want to be **frequently querying** the SQL database for any **other field** (e.g. using any other field in the `WHERE` section), you will probably want to have at least an **index** for that.
## Recap
**Indexes** are very important to improve **reading performance** and speed when querying the database. 🏎
Creating and using them is very **simple** and easy. The most important part is to understand **how** they work, **when** to create them, and for **which columns**.

View File

@@ -81,7 +81,7 @@ In this case, instead of getting all the 7 rows, we are limiting them to only ge
<img class="shadow" alt="table with first 3 rows selected" src="/img/tutorial/offset-and-limit/limit.svg">
## Run the Program on the Comamnd Line
## Run the Program on the Command Line
If we run it on the command line, it will output:
@@ -153,7 +153,7 @@ Each of those methods applies the change in the internal special select statemen
**Offset** means "skip this many rows", and as we want to skip the ones we already saw, the first three, we use `.offset(3)`.
## Run the Program with Offset on the Comamnd Line
## Run the Program with Offset on the Command Line
Now we can run the program on the command line, and it will output:
@@ -207,9 +207,9 @@ The database right now has **only 7 rows**, so this query can only get 1 row.
But don't worry, the database won't throw an error trying to get 3 rows when there's only one (as would happen with a Python list).
The database knows that we want to **limit** the number of results, but it doesn't necessarily has to find those many results.
The database knows that we want to **limit** the number of results, but it doesn't necessarily have to find that many results.
## Run the Program with the Last Batch on the Comamnd Line
## Run the Program with the Last Batch on the Command Line
And if we run it in the command line, it will output:
@@ -271,7 +271,7 @@ Of course, you can also combine `.limit()` and `.offset()` with `.where()` and o
</details>
## Run the Program with Limit and Where on the Comamnd Line
## Run the Program with Limit and Where on the Command Line
If we run it on the command line, it will find all the heroes in the database with an age above 32. That would normally be 4 heroes.

View File

@@ -18,7 +18,7 @@ We'll continue with the same examples we have been using in the previous chapter
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/tutorial/where/tutorial006.py!}
{!./docs_src/tutorial/indexes/tutorial002.py!}
```
</details>
@@ -32,7 +32,7 @@ We have been iterating over the rows in a `result` object like:
```Python hl_lines="7-8"
# Code above omitted 👆
{!./docs_src/tutorial/where/tutorial006.py[ln:44-49]!}
{!./docs_src/tutorial/indexes/tutorial002.py[ln:44-49]!}
# Code below omitted 👇
```
@@ -41,7 +41,7 @@ We have been iterating over the rows in a `result` object like:
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/tutorial/where/tutorial006.py!}
{!./docs_src/tutorial/indexes/tutorial002.py!}
```
</details>

View File

@@ -97,9 +97,9 @@ FROM hero
That would end up in the same result. Although we won't use that for **SQLModel**.
### `SELECT` Less Columns
### `SELECT` Fewer Columns
We can also `SELECT` less columns, for example:
We can also `SELECT` fewer columns, for example:
```SQL
SELECT id, name
@@ -150,7 +150,7 @@ Another variation is that most of the SQL keywords like `SELECT` can also be wri
This is the interesting part. The tables returned by SQL databases **don't have to exist** in the database as independent tables. 🧙
For example, in our database, we only have one table that has all the columns, `id`, `name`, `secret_name`, `age`. And here we are getting a result table with less columns.
For example, in our database, we only have one table that has all the columns, `id`, `name`, `secret_name`, `age`. And here we are getting a result table with fewer columns.
One of the main points of SQL is to be able to keep the data structured in different tables, without repeating data, etc, and then query the database in many ways and get many different tables as a result.

View File

@@ -10,7 +10,7 @@ As before, we'll continue from where we left off with the previous code.
<summary>👀 Full file preview</summary>
```Python
{!./docs_src/tutorial/where/tutorial006.py!}
{!./docs_src/tutorial/indexes/tutorial002.py!}
```
</details>
@@ -39,7 +39,7 @@ In a similar way to `SELECT` statements, the first part defines the columns to w
And the second part, with the `WHERE`, defines to which rows it should apply that update.
In this case, as we only have one hero with the name `"Spider-Boy"`, it will only apply the udpate in that row.
In this case, as we only have one hero with the name `"Spider-Boy"`, it will only apply the update in that row.
!!! info
Notice that in the `UPDATE` the single equals sign (`=`) means **assignment**, setting a column to some value.
@@ -70,7 +70,7 @@ After that update, the data in the table will look like this, with the new age f
</table>
!!! tip
It will probably be more common to find the row to update by Id, for example:
It will probably be more common to find the row to update by `id`, for example:
```SQL
UPDATE hero
@@ -340,7 +340,7 @@ Now let's review all that code:
The update process with **SQLModel** is more or less the same as with creating new objects, you add them to the session, and then commit them.
This also means that you can update several fields (atributes, columns) at once, and you can also update several objects (heroes) at once:
This also means that you can update several fields (attributes, columns) at once, and you can also update several objects (heroes) at once:
```{ .python .annotate hl_lines="15-17 19-21 23" }
# Code above omitted 👆

View File

@@ -204,7 +204,7 @@ We care specially about the **select** statement:
</details>
## Filter Rows Using `WHERE` wtih **SQLModel**
## Filter Rows Using `WHERE` with **SQLModel**
Now, the same way that we add `WHERE` to a SQL statement to filter rows, we can add a `.where()` to a **SQLModel** `select()` statment to filter rows, which will filter the objects returned:
@@ -233,7 +233,7 @@ The object returned by `select(Hero)` is a special type of object with some meth
One of those methods is `.where()` used to (unsurprisingly) add a `WHERE` to the SQL statement in that **select** object.
There are other methods that will will explore later. 💡
There are other methods that we will explore later. 💡
Most of these methods return the same object again after modifying it.
@@ -271,7 +271,7 @@ In the example above we are using two equal signs (`==`). That's called the "**e
!!! tip
An **operator** is just a symbol that is put beside one value or in the middle of two values to do something with them.
`==` is called **equality** operator because it checks if two things are **equal**.
`==` is called the **equality** operator because it checks if two things are **equal**.
When writing Python, if you write something using this equality operator (`==`) like:
@@ -698,7 +698,7 @@ age=35 id=5 name='Black Lion' secret_name='Trevor Challa'
Here's a good moment to see that being able to use these pure Python expressions instead of keyword arguments can help a lot. ✨
We can use the same standard Python comparison operators like `.
We can use the same standard Python comparison operators like `<`, `<=`, `>`, `>=`, `==`, etc.
## Multiple `.where()`
@@ -933,3 +933,7 @@ And with that the editor knows this code is actually fine, because this is a spe
## Recap
You can use `.where()` with powerful expressions using **SQLModel** columns (the special class attributes) to filter the rows that you want. 🚀
Up to now, the database would have been **looking through each one of the records** (rows) to find the ones that match what you want. If you have thousands or millions of records, this could be very **slow**. 😱
In the next section I'll tell you how to add **indexes** to the database, this is what will make the queries **very efficient**. 😎

View File

View File

View File

@@ -0,0 +1,61 @@
from typing import Optional
from pydantic import condecimal
from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
money: condecimal(max_digits=5, decimal_places=3) = Field(default=0)
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson", money=1.1)
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador", money=0.001)
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48, money=2.2)
with Session(engine) as session:
session.add(hero_1)
session.add(hero_2)
session.add(hero_3)
session.commit()
def select_heroes():
with Session(engine) as session:
statement = select(Hero).where(Hero.name == "Deadpond")
results = session.exec(statement)
hero_1 = results.one()
print("Hero 1:", hero_1)
statement = select(Hero).where(Hero.name == "Rusty-Man")
results = session.exec(statement)
hero_2 = results.one()
print("Hero 2:", hero_2)
total_money = hero_1.money + hero_2.money
print(f"Total money: {total_money}")
def main():
create_db_and_tables()
create_heroes()
select_heroes()
if __name__ == "__main__":
main()

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, SQLModel
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")
@@ -13,9 +13,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship(back_populates="heroes")

View File

@@ -8,9 +8,9 @@ if TYPE_CHECKING:
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional["Team"] = Relationship(back_populates="heroes")

View File

@@ -8,7 +8,7 @@ if TYPE_CHECKING:
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, SQLModel, create_engine
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, Session, SQLModel, create_engine
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, Session, SQLModel, create_engine
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,15 +5,15 @@ from sqlmodel import Field, Session, SQLModel, create_engine
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):

View File

@@ -6,9 +6,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
class HeroCreate(SQLModel):

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, sele
class TeamBase(SQLModel):
name: str
name: str = Field(index=True)
headquarters: str
@@ -30,9 +30,9 @@ class TeamUpdate(SQLModel):
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -6,9 +6,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):

View File

@@ -6,9 +6,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, sele
class TeamBase(SQLModel):
name: str
name: str = Field(index=True)
headquarters: str
@@ -30,9 +30,9 @@ class TeamUpdate(SQLModel):
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class HeroBase(SQLModel):
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):

View File

View File

@@ -0,0 +1,51 @@
from typing import Optional
from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
with Session(engine) as session:
session.add(hero_1)
session.add(hero_2)
session.add(hero_3)
session.commit()
def select_heroes():
with Session(engine) as session:
statement = select(Hero).where(Hero.name == "Deadpond")
results = session.exec(statement)
for hero in results:
print(hero)
def main():
create_db_and_tables()
create_heroes()
select_heroes()
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,59 @@
from typing import Optional
from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
engine = create_engine(sqlite_url, echo=True)
def create_db_and_tables():
SQLModel.metadata.create_all(engine)
def create_heroes():
hero_1 = Hero(name="Deadpond", secret_name="Dive Wilson")
hero_2 = Hero(name="Spider-Boy", secret_name="Pedro Parqueador")
hero_3 = Hero(name="Rusty-Man", secret_name="Tommy Sharp", age=48)
hero_4 = Hero(name="Tarantula", secret_name="Natalia Roman-on", age=32)
hero_5 = Hero(name="Black Lion", secret_name="Trevor Challa", age=35)
hero_6 = Hero(name="Dr. Weird", secret_name="Steve Weird", age=36)
hero_7 = Hero(name="Captain North America", secret_name="Esteban Rogelios", age=93)
with Session(engine) as session:
session.add(hero_1)
session.add(hero_2)
session.add(hero_3)
session.add(hero_4)
session.add(hero_5)
session.add(hero_6)
session.add(hero_7)
session.commit()
def select_heroes():
with Session(engine) as session:
statement = select(Hero).where(Hero.age <= 35)
results = session.exec(statement)
for hero in results:
print(hero)
def main():
create_db_and_tables()
create_heroes()
select_heroes()
if __name__ == "__main__":
main()

View File

@@ -14,7 +14,7 @@ class HeroTeamLink(SQLModel, table=True):
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="teams", link_model=HeroTeamLink)
@@ -22,9 +22,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
teams: List[Team] = Relationship(back_populates="heroes", link_model=HeroTeamLink)

View File

@@ -14,7 +14,7 @@ class HeroTeamLink(SQLModel, table=True):
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="teams", link_model=HeroTeamLink)
@@ -22,9 +22,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
teams: List[Team] = Relationship(back_populates="heroes", link_model=HeroTeamLink)

View File

@@ -18,7 +18,7 @@ class HeroTeamLink(SQLModel, table=True):
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
hero_links: List[HeroTeamLink] = Relationship(back_populates="team")
@@ -26,9 +26,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_links: List[HeroTeamLink] = Relationship(back_populates="hero")

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, sele
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship()
@@ -13,9 +13,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship()

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, sele
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")
@@ -13,9 +13,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship(back_populates="heroes")

View File

@@ -5,14 +5,14 @@ from sqlmodel import Field, Relationship, SQLModel, create_engine
class Weapon(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
hero: "Hero" = Relationship(back_populates="weapon")
class Power(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
hero_id: int = Field(foreign_key="hero.id")
hero: "Hero" = Relationship(back_populates="powers")
@@ -20,7 +20,7 @@ class Power(SQLModel, table=True):
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")
@@ -28,9 +28,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship(back_populates="heroes")

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, Session, SQLModel, create_engine
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")
@@ -13,9 +13,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship(back_populates="heroes")

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, Session, SQLModel, create_engine
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")
@@ -13,9 +13,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship(back_populates="heroes")

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, sele
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")
@@ -13,9 +13,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship(back_populates="heroes")

View File

@@ -5,7 +5,7 @@ from sqlmodel import Field, Relationship, Session, SQLModel, create_engine, sele
class Team(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
headquarters: str
heroes: List["Hero"] = Relationship(back_populates="team")
@@ -13,9 +13,9 @@ class Team(SQLModel, table=True):
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
team_id: Optional[int] = Field(default=None, foreign_key="team.id")
team: Optional[Team] = Relationship(back_populates="heroes")

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

View File

@@ -5,9 +5,9 @@ from sqlmodel import Field, Session, SQLModel, create_engine, select
class Hero(SQLModel, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
name: str
name: str = Field(index=True)
secret_name: str
age: Optional[int] = None
age: Optional[int] = Field(default=None, index=True)
sqlite_file_name = "database.db"

4
mkdocs.insiders.yml Normal file
View File

@@ -0,0 +1,4 @@
INHERIT: mkdocs.yml
plugins:
- search
- social

View File

@@ -8,17 +8,18 @@ theme:
primary: deep purple
accent: amber
toggle:
icon: material/lightbulb-outline
name: Switch to light mode
icon: material/lightbulb
name: Switch to dark mode
- scheme: slate
primary: deep purple
accent: amber
toggle:
icon: material/lightbulb
name: Switch to dark mode
icon: material/lightbulb-outline
name: Switch to light mode
features:
- search.suggest
- search.highlight
- content.tabs.link
icon:
repo: fontawesome/brands/github-alt
logo: img/icon-white.svg
@@ -30,8 +31,6 @@ edit_uri: ''
google_analytics:
- UA-205713594-2
- auto
plugins:
- search
nav:
- SQLModel: index.md
- features.md
@@ -45,6 +44,7 @@ nav:
- tutorial/automatic-id-none-refresh.md
- tutorial/select.md
- tutorial/where.md
- tutorial/indexes.md
- tutorial/one.md
- tutorial/limit-and-offset.md
- tutorial/update.md
@@ -86,6 +86,7 @@ nav:
- tutorial/fastapi/tests.md
- Advanced User Guide:
- advanced/index.md
- advanced/decimal.md
- alternatives.md
- help.md
- contributing.md
@@ -104,7 +105,8 @@ markdown_extensions:
- name: mermaid
class: mermaid
format: !!python/name:pymdownx.superfences.fence_div_format ''
- pymdownx.tabbed
- pymdownx.tabbed:
alternate_style: true
- mdx_include
extra:

Some files were not shown because too many files have changed in this diff Show More