Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -307,8 +307,11 @@

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.

Expand All@@ -320,8 +323,11 @@

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.

Expand All@@ -333,8 +339,11 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/delete/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,10 +14,13 @@

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.

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
9 changes: 6 additions & 3 deletions docs_src/tutorial/select/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,10 +16,13 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/update/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,10 +13,13 @@

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.

Expand Down
34 changes: 23 additions & 11 deletions docs_src/tutorial/update/annotations/en/tutorial004.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,12 +35,15 @@
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.

Expand DownExpand Up@@ -98,10 +101,13 @@
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.

Expand All@@ -115,8 +121,11 @@
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.

Expand All@@ -129,8 +138,11 @@
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.

Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -307,8 +307,11 @@

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.

Expand All@@ -320,8 +323,11 @@

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.

Expand All@@ -333,8 +339,11 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/delete/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,10 +14,13 @@

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.

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
9 changes: 6 additions & 3 deletions docs_src/tutorial/select/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,10 +16,13 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/update/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,10 +13,13 @@

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.

Expand Down
34 changes: 23 additions & 11 deletions docs_src/tutorial/update/annotations/en/tutorial004.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,12 +35,15 @@
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.

Expand DownExpand Up@@ -98,10 +101,13 @@
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.

Expand All@@ -115,8 +121,11 @@
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.

Expand All@@ -129,8 +138,11 @@
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.

Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -307,8 +307,11 @@

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.

Expand All@@ -320,8 +323,11 @@

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.

Expand All@@ -333,8 +339,11 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/delete/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,10 +14,13 @@

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.

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
9 changes: 6 additions & 3 deletions docs_src/tutorial/select/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,10 +16,13 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/update/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,10 +13,13 @@

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.

Expand Down
34 changes: 23 additions & 11 deletions docs_src/tutorial/update/annotations/en/tutorial004.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,12 +35,15 @@
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.

Expand DownExpand Up@@ -98,10 +101,13 @@
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.

Expand All@@ -115,8 +121,11 @@
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.

Expand All@@ -129,8 +138,11 @@
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.

Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -307,8 +307,11 @@

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.

Expand All@@ -320,8 +323,11 @@

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.

Expand All@@ -333,8 +339,11 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/delete/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,10 +14,13 @@

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.

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
9 changes: 6 additions & 3 deletions docs_src/tutorial/select/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,10 +16,13 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/update/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,10 +13,13 @@

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.

Expand Down
34 changes: 23 additions & 11 deletions docs_src/tutorial/update/annotations/en/tutorial004.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,12 +35,15 @@
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.

Expand DownExpand Up@@ -98,10 +101,13 @@
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.

Expand All@@ -115,8 +121,11 @@
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.

Expand All@@ -129,8 +138,11 @@
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.

Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -307,8 +307,11 @@

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.

Expand All@@ -320,8 +323,11 @@

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.

Expand All@@ -333,8 +339,11 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/delete/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,10 +14,13 @@

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.

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
9 changes: 6 additions & 3 deletions docs_src/tutorial/select/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,10 +16,13 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/update/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,10 +13,13 @@

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.

Expand Down
34 changes: 23 additions & 11 deletions docs_src/tutorial/update/annotations/en/tutorial004.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,12 +35,15 @@
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.

Expand DownExpand Up@@ -98,10 +101,13 @@
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.

Expand All@@ -115,8 +121,11 @@
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.

Expand All@@ -129,8 +138,11 @@
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.

Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -307,8 +307,11 @@

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.

Expand All@@ -320,8 +323,11 @@

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.

Expand All@@ -333,8 +339,11 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/delete/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,10 +14,13 @@

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.

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
9 changes: 6 additions & 3 deletions docs_src/tutorial/select/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,10 +16,13 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/update/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,10 +13,13 @@

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.

Expand Down
34 changes: 23 additions & 11 deletions docs_src/tutorial/update/annotations/en/tutorial004.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,12 +35,15 @@
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.

Expand DownExpand Up@@ -98,10 +101,13 @@
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.

Expand All@@ -115,8 +121,11 @@
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.

Expand All@@ -129,8 +138,11 @@
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.

Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -307,8 +307,11 @@

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.

Expand All@@ -320,8 +323,11 @@

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.

Expand All@@ -333,8 +339,11 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/delete/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,10 +14,13 @@

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.

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
9 changes: 6 additions & 3 deletions docs_src/tutorial/select/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,10 +16,13 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/update/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,10 +13,13 @@

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.

Expand Down
34 changes: 23 additions & 11 deletions docs_src/tutorial/update/annotations/en/tutorial004.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,12 +35,15 @@
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.

Expand DownExpand Up@@ -98,10 +101,13 @@
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.

Expand All@@ -115,8 +121,11 @@
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.

Expand All@@ -129,8 +138,11 @@
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.

Expand Down
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -307,8 +307,11 @@

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.

Expand All@@ -320,8 +323,11 @@

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.

Expand All@@ -333,8 +339,11 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/delete/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,10 +14,13 @@

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.

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
Original file line numberDiff line numberDiff line change
Expand Up@@ -22,5 +22,8 @@

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>

///
9 changes: 6 additions & 3 deletions docs_src/tutorial/select/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -16,10 +16,13 @@

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.

Expand Down
9 changes: 6 additions & 3 deletions docs_src/tutorial/update/annotations/en/tutorial002.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,10 +13,13 @@

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.

Expand Down
34 changes: 23 additions & 11 deletions docs_src/tutorial/update/annotations/en/tutorial004.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -35,12 +35,15 @@
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.

Expand DownExpand Up@@ -98,10 +101,13 @@
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.

Expand All@@ -115,8 +121,11 @@
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.

Expand All@@ -129,8 +138,11 @@
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.

Expand Down