33. Print the `hero_1`.
- !!! info
- Even if the `hero_1` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
+ /// info
+
+ Even if the `hero_1` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
+
+ ///
Because the `hero_1` is fresh it has all it's data available.
34. Print the `hero_2`.
- !!! info
- Even if the `hero_2` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
+ /// info
+
+ Even if the `hero_2` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
+
+ ///
Because the `hero_2` is fresh it has all it's data available.
35. Print the `hero_3`.
- !!! info
- Even if the `hero_3` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
+ /// info
+
+ Even if the `hero_3` wasn't fresh, this would **not** trigger a `refresh` making the **session** use the **engine** to fetch data from the database because it is not accessing an attribute.
+
+ ///
Because the `hero_3` is fresh it has all it's data available.
3. Get one hero object, expecting exactly one.
- !!! tip
- This ensures there's no more than one, and that there's exactly one, not `None`.
+ /// tip
- This would never return `None`, instead it would raise an exception.
+ This ensures there's no more than one, and that there's exactly one, not `None`.
+
+ This would never return `None`, instead it would raise an exception.
+
+ ///
4. Print the hero object.
We tell it that with the `poolclass=StaticPool` parameter.
- !!! info
- You can read more details in the <a href="https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#using-a-memory-database-in-multiple-threads" class="external-link" target="_blank">SQLAlchemy documentation about Using a Memory Database in Multiple Threads</a>
+ /// info
+
+ You can read more details in the <a href="https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#using-a-memory-database-in-multiple-threads" class="external-link" target="_blank">SQLAlchemy documentation about Using a Memory Database in Multiple Threads</a>
+
+ ///
We tell it that with the `poolclass=StaticPool` parameter.
- !!! info
- You can read more details in the <a href="https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#using-a-memory-database-in-multiple-threads" class="external-link" target="_blank">SQLAlchemy documentation about Using a Memory Database in Multiple Threads</a>
+ /// info
+
+ You can read more details in the <a href="https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#using-a-memory-database-in-multiple-threads" class="external-link" target="_blank">SQLAlchemy documentation about Using a Memory Database in Multiple Threads</a>
+
+ ///
We tell it that with the `poolclass=StaticPool` parameter.
- !!! info
- You can read more details in the <a href="https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#using-a-memory-database-in-multiple-threads" class="external-link" target="_blank">SQLAlchemy documentation about Using a Memory Database in Multiple Threads</a>
+ /// info
+
+ You can read more details in the <a href="https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#using-a-memory-database-in-multiple-threads" class="external-link" target="_blank">SQLAlchemy documentation about Using a Memory Database in Multiple Threads</a>
+
+ ///
7. Create a new **session** to query data.
- !!! tip
- Notice that this is a new **session** independent from the one in the other function above.
+ /// tip
- But it still uses the same **engine**. We still have one engine for the whole application.
+ Notice that this is a new **session** independent from the one in the other function above.
+
+ But it still uses the same **engine**. We still have one engine for the whole application.
+
+ ///
8. Use the `select()` function to create a statement selecting all the `Hero` objects.
3. Get one hero object, expecting exactly one.
- !!! tip
- This ensures there's no more than one, and that there's exactly one, not `None`.
+ /// tip
- This would never return `None`, instead it would raise an exception.
+ This ensures there's no more than one, and that there's exactly one, not `None`.
+
+ This would never return `None`, instead it would raise an exception.
+
+ ///
4. Print the hero object.
INFO Engine [no key 0.00020s] ('Captain North America',)
```
- !!! tip
- See the `BEGIN` at the top?
+ /// tip
- This is SQLAlchemy automatically starting a transaction for us.
+ See the `BEGIN` at the top?
- This way, we could revert the last changes (if there were some) if we wanted to, even if the SQL to create them was already sent to the database.
+ This is SQLAlchemy automatically starting a transaction for us.
+
+ This way, we could revert the last changes (if there were some) if we wanted to, even if the SQL to create them was already sent to the database.
+
+ ///
7. Get one hero object for this new query.
INFO Engine COMMIT
```
- !!! tip
- See how SQLAlchemy (that powers SQLModel) optimizes the SQL to do as much work as possible in a single batch.
+ /// tip
+
+ See how SQLAlchemy (that powers SQLModel) optimizes the SQL to do as much work as possible in a single batch.
+
+ Here it updates both heroes in a single SQL query.
- Here it updates both heroes in a single SQL query.
+ ///
16. Refresh the first hero.
INFO Engine [generated in 0.00023s] (2,)
```
- !!! tip
- Because we just committed a SQL transaction with `COMMIT`, SQLAlchemy will automatically start a new transaction with `BEGIN`.
+ /// tip
+
+ Because we just committed a SQL transaction with `COMMIT`, SQLAlchemy will automatically start a new transaction with `BEGIN`.
+
+ ///
17. Refresh the second hero.
INFO Engine [cached since 0.001709s ago] (7,)
```
- !!! tip
- SQLAlchemy is still using the previous transaction, so it doesn't have to create a new one.
+ /// tip
+
+ SQLAlchemy is still using the previous transaction, so it doesn't have to create a new one.
+
+ ///
18. Print the first hero, now updated.