Essential SQLAlchemy: Chapter 2 (v2)
This commit is contained in:
+664
-33
@@ -258,13 +258,13 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
* Chapter 2: Working with Data via SQLAlchemy Core
|
* Chapter 2: Working with Data via SQLAlchemy Core
|
||||||
|
** SQLAlchemy v1
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:header-args:python: :session *ch2*
|
:header-args: :cache yes
|
||||||
:header-args: :cache no
|
:header-args:python: :tangle ch2-v1.py
|
||||||
|
:header-args: :session *ch2*
|
||||||
:END:
|
:END:
|
||||||
|
#+BEGIN_SRC python :results none :shebang "#!/usr/bin/env python3"
|
||||||
#+NAME: PRE0
|
|
||||||
#+BEGIN_SRC python :tangle no :noweb no :results none
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from sqlalchemy import (
|
from sqlalchemy import (
|
||||||
@@ -358,10 +358,7 @@
|
|||||||
metadata.create_all(engine)
|
metadata.create_all(engine)
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
** SQLAlchemy v1
|
|
||||||
|
|
||||||
*** Insert Data
|
*** Insert Data
|
||||||
#+NAME: A2
|
|
||||||
#+BEGIN_SRC python :results value
|
#+BEGIN_SRC python :results value
|
||||||
ins = cookies.insert().values(
|
ins = cookies.insert().values(
|
||||||
cookie_name="chocolate chip",
|
cookie_name="chocolate chip",
|
||||||
@@ -373,11 +370,11 @@
|
|||||||
sqlf(ins)
|
sqlf(ins)
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[6c5ae602a67e3d9c44ec5b557dbe4c9caa045f7d]: A2
|
#+RESULTS: A2
|
||||||
: INSERT INTO cookies (cookie_name, cookie_recipe_url, cookie_sku, quantity, unit_cost)
|
: INSERT INTO cookies (cookie_name, cookie_recipe_url, cookie_sku, quantity, unit_cost)
|
||||||
: VALUES (:cookie_name, :cookie_recipe_url, :cookie_sku, :quantity, :unit_cost)
|
: VALUES (:cookie_name, :cookie_recipe_url, :cookie_sku, :quantity, :unit_cost)
|
||||||
|
|
||||||
#+NAME: B2
|
|
||||||
#+BEGIN_SRC python :results value
|
#+BEGIN_SRC python :results value
|
||||||
import json
|
import json
|
||||||
|
|
||||||
@@ -393,7 +390,6 @@
|
|||||||
: "unit_cost": "0.50"
|
: "unit_cost": "0.50"
|
||||||
: }
|
: }
|
||||||
|
|
||||||
#+NAME: C2
|
|
||||||
#+BEGIN_SRC python :results table
|
#+BEGIN_SRC python :results table
|
||||||
result = connection.execute(ins)
|
result = connection.execute(ins)
|
||||||
result.inserted_primary_key
|
result.inserted_primary_key
|
||||||
@@ -402,7 +398,6 @@
|
|||||||
#+RESULTS[2f53d5414462ab280cdac9899df147cdfb23ca85]: C2
|
#+RESULTS[2f53d5414462ab280cdac9899df147cdfb23ca85]: C2
|
||||||
| 1 |
|
| 1 |
|
||||||
|
|
||||||
#+NAME: D2
|
|
||||||
#+BEGIN_SRC python :results table
|
#+BEGIN_SRC python :results table
|
||||||
ins = cookies.insert()
|
ins = cookies.insert()
|
||||||
result = connection.execute(
|
result = connection.execute(
|
||||||
@@ -421,7 +416,6 @@
|
|||||||
#+RESULTS[ce29752b9e0ffb2e8359d9455b40c0177eaed45b]: D2
|
#+RESULTS[ce29752b9e0ffb2e8359d9455b40c0177eaed45b]: D2
|
||||||
| 2 |
|
| 2 |
|
||||||
|
|
||||||
#+NAME: E2
|
|
||||||
#+BEGIN_SRC python :results table
|
#+BEGIN_SRC python :results table
|
||||||
from sqlalchemy import insert
|
from sqlalchemy import insert
|
||||||
ins = insert(cookies).values(
|
ins = insert(cookies).values(
|
||||||
@@ -520,9 +514,9 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[111aa8e58f95f1c58373419ef284b39f24928b09]:
|
#+RESULTS[111aa8e58f95f1c58373419ef284b39f24928b09]:
|
||||||
: 2026-09-16 15:38:27,551 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_id, cookies.cookie_name, cookies.cookie_recipe_url, cookies.cookie_sku, cookies.quantity, cookies.unit_cost
|
: 2026-09-16 18:20:06,397 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_id, cookies.cookie_name, cookies.cookie_recipe_url, cookies.cookie_sku, cookies.quantity, cookies.unit_cost
|
||||||
: FROM cookies
|
: FROM cookies
|
||||||
: 2026-09-16 15:38:27,551 INFO sqlalchemy.engine.Engine [cached since 0.09296s ago] ()
|
: 2026-09-16 18:20:06,398 INFO sqlalchemy.engine.Engine [cached since 0.1297s ago] ()
|
||||||
: chocolate chip
|
: chocolate chip
|
||||||
: dark chocolate chip
|
: dark chocolate chip
|
||||||
: ligth chocolate chip
|
: ligth chocolate chip
|
||||||
@@ -539,9 +533,9 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[d36e227d4963ac6498d81bc68b7230f0482aee36]:
|
#+RESULTS[d36e227d4963ac6498d81bc68b7230f0482aee36]:
|
||||||
: 2026-09-16 15:38:27,565 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
: 2026-09-16 18:20:06,420 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
||||||
: FROM cookies
|
: FROM cookies
|
||||||
: 2026-09-16 15:38:27,565 INFO sqlalchemy.engine.Engine [generated in 0.00014s] ()
|
: 2026-09-16 18:20:06,421 INFO sqlalchemy.engine.Engine [generated in 0.00045s] ()
|
||||||
: RMKeyView(['cookie_name', 'quantity'])
|
: RMKeyView(['cookie_name', 'quantity'])
|
||||||
: ('chocolate chip', 12)
|
: ('chocolate chip', 12)
|
||||||
|
|
||||||
@@ -555,9 +549,9 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[1a2648ac7db3983f3b128e81e12e34b1e0e3511b]:
|
#+RESULTS[1a2648ac7db3983f3b128e81e12e34b1e0e3511b]:
|
||||||
: 2026-09-16 15:38:27,579 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
: 2026-09-16 18:20:06,443 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
||||||
: FROM cookies ORDER BY cookies.quantity
|
: FROM cookies ORDER BY cookies.quantity
|
||||||
: 2026-09-16 15:38:27,579 INFO sqlalchemy.engine.Engine [generated in 0.00012s] ()
|
: 2026-09-16 18:20:06,443 INFO sqlalchemy.engine.Engine [generated in 0.00017s] ()
|
||||||
: 1 - dark chocolate chip
|
: 1 - dark chocolate chip
|
||||||
: 10 - ligth chocolate chip
|
: 10 - ligth chocolate chip
|
||||||
: 12 - chocolate chip
|
: 12 - chocolate chip
|
||||||
@@ -589,10 +583,10 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[61fc508f77cde00bb8a46a1cff9f7714585d6bac]:
|
#+RESULTS[61fc508f77cde00bb8a46a1cff9f7714585d6bac]:
|
||||||
: 2026-09-16 15:38:27,623 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
: 2026-09-16 18:20:06,508 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
||||||
: FROM cookies ORDER BY cookies.quantity
|
: FROM cookies ORDER BY cookies.quantity
|
||||||
: LIMIT ? OFFSET ?
|
: LIMIT ? OFFSET ?
|
||||||
: 2026-09-16 15:38:27,623 INFO sqlalchemy.engine.Engine [generated in 0.00015s] (2, 0)
|
: 2026-09-16 18:20:06,512 INFO sqlalchemy.engine.Engine [generated in 0.00363s] (2, 0)
|
||||||
: ['dark chocolate chip', 'ligth chocolate chip']
|
: ['dark chocolate chip', 'ligth chocolate chip']
|
||||||
|
|
||||||
**** Functions and Labels
|
**** Functions and Labels
|
||||||
@@ -605,9 +599,9 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[dab408afcef7a07ab4529319e360e98963ef9253]:
|
#+RESULTS[dab408afcef7a07ab4529319e360e98963ef9253]:
|
||||||
: 2026-09-16 15:38:27,637 INFO sqlalchemy.engine.Engine SELECT sum(cookies.quantity) AS sum_1
|
: 2026-09-16 18:20:06,530 INFO sqlalchemy.engine.Engine SELECT sum(cookies.quantity) AS sum_1
|
||||||
: FROM cookies
|
: FROM cookies
|
||||||
: 2026-09-16 15:38:27,637 INFO sqlalchemy.engine.Engine [generated in 0.00015s] ()
|
: 2026-09-16 18:20:06,531 INFO sqlalchemy.engine.Engine [generated in 0.00018s] ()
|
||||||
: 147
|
: 147
|
||||||
|
|
||||||
#+BEGIN_SRC python :results output
|
#+BEGIN_SRC python :results output
|
||||||
@@ -619,9 +613,9 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[cd4d9e1c7b306fcaac0f2ec879ba6eb9b8820a76]:
|
#+RESULTS[cd4d9e1c7b306fcaac0f2ec879ba6eb9b8820a76]:
|
||||||
: 2026-09-16 15:38:27,650 INFO sqlalchemy.engine.Engine SELECT count(cookies.cookie_name) AS count_1
|
: 2026-09-16 18:20:06,548 INFO sqlalchemy.engine.Engine SELECT count(cookies.cookie_name) AS count_1
|
||||||
: FROM cookies
|
: FROM cookies
|
||||||
: 2026-09-16 15:38:27,650 INFO sqlalchemy.engine.Engine [generated in 0.00012s] ()
|
: 2026-09-16 18:20:06,548 INFO sqlalchemy.engine.Engine [generated in 0.00028s] ()
|
||||||
: ('count_1',)
|
: ('count_1',)
|
||||||
: 5
|
: 5
|
||||||
|
|
||||||
@@ -634,9 +628,9 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[631333575ed407008ac3e744e2dd1071d2ad5fc8]:
|
#+RESULTS[631333575ed407008ac3e744e2dd1071d2ad5fc8]:
|
||||||
: 2026-09-16 15:38:27,664 INFO sqlalchemy.engine.Engine SELECT count(cookies.cookie_name) AS inventory_count
|
: 2026-09-16 18:20:06,572 INFO sqlalchemy.engine.Engine SELECT count(cookies.cookie_name) AS inventory_count
|
||||||
: FROM cookies
|
: FROM cookies
|
||||||
: 2026-09-16 15:38:27,664 INFO sqlalchemy.engine.Engine [generated in 0.00016s] ()
|
: 2026-09-16 18:20:06,572 INFO sqlalchemy.engine.Engine [generated in 0.00027s] ()
|
||||||
: ('inventory_count',)
|
: ('inventory_count',)
|
||||||
: 5
|
: 5
|
||||||
|
|
||||||
@@ -667,10 +661,10 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[1923587b001fd049bf657d33ffc97e3313882d08]:
|
#+RESULTS[1923587b001fd049bf657d33ffc97e3313882d08]:
|
||||||
: 2026-09-16 15:38:27,710 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_id, cookies.cookie_name, cookies.cookie_recipe_url, cookies.cookie_sku, cookies.quantity, cookies.unit_cost
|
: 2026-09-16 18:20:06,635 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_id, cookies.cookie_name, cookies.cookie_recipe_url, cookies.cookie_sku, cookies.quantity, cookies.unit_cost
|
||||||
: FROM cookies
|
: FROM cookies
|
||||||
: WHERE cookies.cookie_name LIKE ?
|
: WHERE cookies.cookie_name LIKE ?
|
||||||
: 2026-09-16 15:38:27,710 INFO sqlalchemy.engine.Engine [generated in 0.00015s] ('%chocolate%',)
|
: 2026-09-16 18:20:06,638 INFO sqlalchemy.engine.Engine [generated in 0.00392s] ('%chocolate%',)
|
||||||
: chocolate chip
|
: chocolate chip
|
||||||
: dark chocolate chip
|
: dark chocolate chip
|
||||||
: ligth chocolate chip
|
: ligth chocolate chip
|
||||||
@@ -864,10 +858,10 @@
|
|||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
#+RESULTS[5ecd8eac1228fddbc2304d381cc0148fc740d30d]:
|
#+RESULTS[5ecd8eac1228fddbc2304d381cc0148fc740d30d]:
|
||||||
| user_id | username | email_address | phone | password | created_on | updated_on | | |
|
| user_id | username | email_address | phone | password | created_on | updated_on | | |
|
||||||
| 1 | cookiemon | mon@cookie.com | 111-111-1111 | password | datetime.datetime | (2026 9 16 15 39 54 867291) | datetime.datetime | (2026 9 16 15 39 54 867299) |
|
| 1 | cookiemon | mon@cookie.com | 111-111-1111 | password | datetime.datetime | (2026 9 16 18 20 6 947339) | datetime.datetime | (2026 9 16 18 20 6 947349) |
|
||||||
| 2 | cakeeater | cakeeater@cake.com | 222-222-2222 | password | datetime.datetime | (2026 9 16 15 39 54 867301) | datetime.datetime | (2026 9 16 15 39 54 867302) |
|
| 2 | cakeeater | cakeeater@cake.com | 222-222-2222 | password | datetime.datetime | (2026 9 16 18 20 6 947352) | datetime.datetime | (2026 9 16 18 20 6 947355) |
|
||||||
| 3 | pieguy | guy@pie.com | 333-333-3333 | password | datetime.datetime | (2026 9 16 15 39 54 867302) | datetime.datetime | (2026 9 16 15 39 54 867303) |
|
| 3 | pieguy | guy@pie.com | 333-333-3333 | password | datetime.datetime | (2026 9 16 18 20 6 947359) | datetime.datetime | (2026 9 16 18 20 6 947360) |
|
||||||
|
|
||||||
#+BEGIN_SRC python :results table :cache no
|
#+BEGIN_SRC python :results table :cache no
|
||||||
columns = [
|
columns = [
|
||||||
@@ -892,3 +886,640 @@
|
|||||||
result = connection.execute(cookiemon_orders)
|
result = connection.execute(cookiemon_orders)
|
||||||
[row for row in result]
|
[row for row in result]
|
||||||
#+END_SRC
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
| 1 | cookiemon | 111-111-1111 | chocolate chip | 2 | Decimal | (1.00) |
|
||||||
|
| 1 | cookiemon | 111-111-1111 | ligth chocolate chip | 12 | Decimal | (3.00) |
|
||||||
|
|
||||||
|
** TODO SQLAlchemy v2
|
||||||
|
:PROPERTIES:
|
||||||
|
:header-args:python: :cache no
|
||||||
|
:header-args:python: :tangle ch2-v2.py
|
||||||
|
:header-args: :session *ch2v2*
|
||||||
|
:END:
|
||||||
|
#+BEGIN_SRC python :results none :shebang "#!/usr/bin/env python3"
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from sqlalchemy import (
|
||||||
|
Boolean,
|
||||||
|
CheckConstraint,
|
||||||
|
Column,
|
||||||
|
DateTime,
|
||||||
|
ForeignKey,
|
||||||
|
Integer,
|
||||||
|
MetaData,
|
||||||
|
Numeric,
|
||||||
|
PrimaryKeyConstraint,
|
||||||
|
String,
|
||||||
|
Table,
|
||||||
|
UniqueConstraint,
|
||||||
|
create_engine,
|
||||||
|
)
|
||||||
|
from sqlparse import format as sqlformat
|
||||||
|
|
||||||
|
|
||||||
|
def sqlf(
|
||||||
|
sql: str | object,
|
||||||
|
reindent=True,
|
||||||
|
keyword_case="upper",
|
||||||
|
indent_width=2,
|
||||||
|
strip_comments=False,
|
||||||
|
identifier_case="lower",
|
||||||
|
):
|
||||||
|
if not isinstance(sql, str):
|
||||||
|
sql = str(sql)
|
||||||
|
return sqlformat(
|
||||||
|
sql,
|
||||||
|
encoding="utf8",
|
||||||
|
reindent=reindent,
|
||||||
|
keyword_case=keyword_case,
|
||||||
|
indent_width=indent_width,
|
||||||
|
strip_comments=strip_comments,
|
||||||
|
identifier_case=identifier_case,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
metadata = MetaData()
|
||||||
|
|
||||||
|
cookies = Table(
|
||||||
|
"cookies",
|
||||||
|
metadata,
|
||||||
|
Column("cookie_id", Integer(), primary_key=True),
|
||||||
|
Column("cookie_name", String(50), index=True),
|
||||||
|
Column("cookie_recipe_url", String(255), unique=True),
|
||||||
|
Column("cookie_sku", String(55), unique=True),
|
||||||
|
Column("quantity", Integer()),
|
||||||
|
Column("unit_cost", Numeric(12, 2)),
|
||||||
|
CheckConstraint("unit_cost >= 0.00", name="unit_cost_positive"),
|
||||||
|
)
|
||||||
|
|
||||||
|
users = Table(
|
||||||
|
"users",
|
||||||
|
metadata,
|
||||||
|
Column("user_id", Integer()),
|
||||||
|
Column("username", String(15), nullable=False),
|
||||||
|
Column("email_address", String(255), nullable=False),
|
||||||
|
Column("phone", String(20), nullable=False),
|
||||||
|
Column("password", String(25), nullable=False),
|
||||||
|
Column("created_on", DateTime(), default=datetime.now),
|
||||||
|
Column("updated_on", DateTime(), default=datetime.now, onupdate=datetime.now),
|
||||||
|
PrimaryKeyConstraint("user_id", name="user_pk"),
|
||||||
|
UniqueConstraint("username", name="uix_username"),
|
||||||
|
)
|
||||||
|
|
||||||
|
orders = Table(
|
||||||
|
"orders",
|
||||||
|
metadata,
|
||||||
|
Column("order_id", Integer(), primary_key=True),
|
||||||
|
Column("user_id", ForeignKey("users.user_id")),
|
||||||
|
Column("shipped", Boolean(), default=False),
|
||||||
|
)
|
||||||
|
|
||||||
|
line_items = Table(
|
||||||
|
"line_items",
|
||||||
|
metadata,
|
||||||
|
Column("line_items_id", Integer(), primary_key=True),
|
||||||
|
Column("order_id", ForeignKey("orders.order_id")),
|
||||||
|
Column("cookie_id", ForeignKey("cookies.cookie_id")),
|
||||||
|
Column("quantity", Integer()),
|
||||||
|
Column("extended_cost", Numeric(12, 2)),
|
||||||
|
)
|
||||||
|
|
||||||
|
from sqlalchemy.pool import StaticPool
|
||||||
|
|
||||||
|
engine = create_engine("sqlite:///:memory:", echo=True)
|
||||||
|
connection = engine.connect()
|
||||||
|
metadata.create_all(connection)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
*** Insert Data
|
||||||
|
#+BEGIN_SRC python :results value
|
||||||
|
ins = cookies.insert().values(
|
||||||
|
cookie_name="chocolate chip",
|
||||||
|
cookie_recipe_url="http://some.aweso.me/cookie/recipe.html",
|
||||||
|
cookie_sku="CC01",
|
||||||
|
quantity="12",
|
||||||
|
unit_cost="0.50"
|
||||||
|
)
|
||||||
|
sqlf(ins)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[b62598d5e632b067ebfae4b1023821ee0e7091b6]:
|
||||||
|
: INSERT INTO cookies (cookie_name, cookie_recipe_url, cookie_sku, quantity, unit_cost)
|
||||||
|
: VALUES (:cookie_name, :cookie_recipe_url, :cookie_sku, :quantity, :unit_cost)
|
||||||
|
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results value
|
||||||
|
import json
|
||||||
|
|
||||||
|
json.dumps(ins.compile().params, indent=2)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[0018258860595918dc2f188cc9c30a07ddb14922]:
|
||||||
|
: {
|
||||||
|
: "cookie_name": "chocolate chip",
|
||||||
|
: "cookie_recipe_url": "http://some.aweso.me/cookie/recipe.html",
|
||||||
|
: "cookie_sku": "CC01",
|
||||||
|
: "quantity": "12",
|
||||||
|
: "unit_cost": "0.50"
|
||||||
|
: }
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
result = connection.execute(ins)
|
||||||
|
connection.commit()
|
||||||
|
result.inserted_primary_key
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[79ef993cf722a486accb9755751bc78723fc38e2]:
|
||||||
|
| 1 |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
ins = cookies.insert()
|
||||||
|
result = connection.execute(
|
||||||
|
ins,
|
||||||
|
dict(
|
||||||
|
cookie_name="dark chocolate chip",
|
||||||
|
cookie_recipe_url="http://some.aweso.me/cookie/recipe_dark.html",
|
||||||
|
cookie_sku="CC02",
|
||||||
|
quantity=1,
|
||||||
|
unit_cost=0.75,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
connection.commit()
|
||||||
|
result.inserted_primary_key
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[0e9166654b4c44b69add0fb4c1c060b11ed4f926]:
|
||||||
|
| 2 |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
from sqlalchemy import insert
|
||||||
|
ins = insert(cookies).values(
|
||||||
|
cookie_name="ligth chocolate chip",
|
||||||
|
cookie_recipe_url="http://some.aweso.me/cookie/recipe_light.html",
|
||||||
|
cookie_sku="CC03",
|
||||||
|
quantity=10,
|
||||||
|
unit_cost=0.5
|
||||||
|
)
|
||||||
|
result = connection.execute(ins)
|
||||||
|
connection.commit()
|
||||||
|
result.inserted_primary_key
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[676c23b01f138d7d6fb622cc3cbf3b77eed25d1a]:
|
||||||
|
| 3 |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
ins = cookies.insert()
|
||||||
|
inventory_list = [
|
||||||
|
{
|
||||||
|
"cookie_name": "peanut butter",
|
||||||
|
"cookie_recipe_url": "http://some.aweso.me/cookie/panut.html",
|
||||||
|
"cookie_sku": "PB01",
|
||||||
|
"quantity": 24,
|
||||||
|
"unit_cost": 0.25
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cookie_name": "oatmeal raisin",
|
||||||
|
"cookie_recipe_url": "http://some.okay.me/cookie/raisin.html",
|
||||||
|
"cookie_sku": "EWW01",
|
||||||
|
"quantity": 100,
|
||||||
|
"unit_cost": 1.00
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
result = connection.execute(ins, inventory_list)
|
||||||
|
connection.commit()
|
||||||
|
result.rowcount
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[c3ed83418f832724ad79a751480a4f4cd6c6c498]:
|
||||||
|
| 2 |
|
||||||
|
|
||||||
|
*** Querying Data
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
from sqlalchemy import select
|
||||||
|
|
||||||
|
s = select(cookies)
|
||||||
|
result = connection.execute(s)
|
||||||
|
result.all()
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[3640959102aca0eaee952f069da52aacf1e93bbe]:
|
||||||
|
| 1 | chocolate chip | http://some.aweso.me/cookie/recipe.html | CC01 | 12 | Decimal | (0.50) |
|
||||||
|
| 2 | dark chocolate chip | http://some.aweso.me/cookie/recipe_dark.html | CC02 | 1 | Decimal | (0.75) |
|
||||||
|
| 3 | ligth chocolate chip | http://some.aweso.me/cookie/recipe_light.html | CC03 | 10 | Decimal | (0.50) |
|
||||||
|
| 4 | peanut butter | http://some.aweso.me/cookie/panut.html | PB01 | 24 | Decimal | (0.25) |
|
||||||
|
| 5 | oatmeal raisin | http://some.okay.me/cookie/raisin.html | EWW01 | 100 | Decimal | (1.00) |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
s = select(cookies)
|
||||||
|
results = connection.execute(s).all()
|
||||||
|
results
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[fe970d04609a1b31e98475c19bda532182fd1b60]:
|
||||||
|
| 1 | chocolate chip | http://some.aweso.me/cookie/recipe.html | CC01 | 12 | Decimal | (0.50) |
|
||||||
|
| 2 | dark chocolate chip | http://some.aweso.me/cookie/recipe_dark.html | CC02 | 1 | Decimal | (0.75) |
|
||||||
|
| 3 | ligth chocolate chip | http://some.aweso.me/cookie/recipe_light.html | CC03 | 10 | Decimal | (0.50) |
|
||||||
|
| 4 | peanut butter | http://some.aweso.me/cookie/panut.html | PB01 | 24 | Decimal | (0.25) |
|
||||||
|
| 5 | oatmeal raisin | http://some.okay.me/cookie/raisin.html | EWW01 | 100 | Decimal | (1.00) |
|
||||||
|
|
||||||
|
**** Result
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
first_row = results[0]
|
||||||
|
(
|
||||||
|
first_row[1],
|
||||||
|
first_row.cookie_name,
|
||||||
|
first_row._mapping[cookies.c.cookie_name]
|
||||||
|
)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[2ead18cf1a413cd3284e77709422a06a3900433b]:
|
||||||
|
| chocolate chip | chocolate chip | chocolate chip |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results output
|
||||||
|
rp = connection.execute(select(cookies))
|
||||||
|
for record in rp:
|
||||||
|
print(record.cookie_name)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[c40dd53b6f4d7186421b259a0e1b11342abd78c2]:
|
||||||
|
: 2026-09-16 19:25:14,506 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_id, cookies.cookie_name, cookies.cookie_recipe_url, cookies.cookie_sku, cookies.quantity, cookies.unit_cost
|
||||||
|
: FROM cookies
|
||||||
|
: 2026-09-16 19:25:14,506 INFO sqlalchemy.engine.Engine [cached since 0.09276s ago] ()
|
||||||
|
: chocolate chip
|
||||||
|
: dark chocolate chip
|
||||||
|
: ligth chocolate chip
|
||||||
|
: peanut butter
|
||||||
|
: oatmeal raisin
|
||||||
|
|
||||||
|
**** Controlling the Columns in the Query
|
||||||
|
#+BEGIN_SRC python :results output
|
||||||
|
s = select(cookies.c.cookie_name, cookies.c.quantity)
|
||||||
|
rp = connection.execute(s)
|
||||||
|
print(rp.keys())
|
||||||
|
result = rp.first()
|
||||||
|
print(result)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[9bd5d9f918c47340cf4915a5206b1e6ea9409427]:
|
||||||
|
: 2026-09-16 19:25:14,520 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
||||||
|
: FROM cookies
|
||||||
|
: 2026-09-16 19:25:14,521 INFO sqlalchemy.engine.Engine [generated in 0.00015s] ()
|
||||||
|
: RMKeyView(['cookie_name', 'quantity'])
|
||||||
|
: ('chocolate chip', 12)
|
||||||
|
|
||||||
|
**** Ordering
|
||||||
|
#+BEGIN_SRC python :results output
|
||||||
|
s = select(cookies.c.cookie_name, cookies.c.quantity)
|
||||||
|
s = s.order_by(cookies.c.quantity)
|
||||||
|
rp = connection.execute(s)
|
||||||
|
for cookie in rp:
|
||||||
|
print("{} - {}".format(cookie.quantity, cookie.cookie_name))
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[81dbba92b0ffa27f5dec5f713d59ab32f1ad2f78]:
|
||||||
|
: 2026-09-16 19:25:14,532 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
||||||
|
: FROM cookies ORDER BY cookies.quantity
|
||||||
|
: 2026-09-16 19:25:14,532 INFO sqlalchemy.engine.Engine [generated in 0.00017s] ()
|
||||||
|
: 1 - dark chocolate chip
|
||||||
|
: 10 - ligth chocolate chip
|
||||||
|
: 12 - chocolate chip
|
||||||
|
: 24 - peanut butter
|
||||||
|
: 100 - oatmeal raisin
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
from sqlalchemy import desc
|
||||||
|
s = select(cookies.c.cookie_name, cookies.c.quantity)
|
||||||
|
s = s.order_by(desc(cookies.c.quantity))
|
||||||
|
rp = connection.execute(s)
|
||||||
|
rp.all()
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[bafc4ff430e023ef53ecaedafba7ca47bd89a027]:
|
||||||
|
| oatmeal raisin | 100 |
|
||||||
|
| peanut butter | 24 |
|
||||||
|
| chocolate chip | 12 |
|
||||||
|
| ligth chocolate chip | 10 |
|
||||||
|
| dark chocolate chip | 1 |
|
||||||
|
|
||||||
|
**** Limiting
|
||||||
|
#+BEGIN_SRC python :results output
|
||||||
|
s = select(cookies.c.cookie_name, cookies.c.quantity)
|
||||||
|
s = s.order_by(cookies.c.quantity)
|
||||||
|
s = s.limit(2)
|
||||||
|
rp = connection.execute(s)
|
||||||
|
print([result.cookie_name for result in rp])
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[42c818a0ef9918c538fc39f00bc2012b619081a9]:
|
||||||
|
: 2026-09-16 19:25:14,582 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_name, cookies.quantity
|
||||||
|
: FROM cookies ORDER BY cookies.quantity
|
||||||
|
: LIMIT ? OFFSET ?
|
||||||
|
: 2026-09-16 19:25:14,582 INFO sqlalchemy.engine.Engine [generated in 0.00020s] (2, 0)
|
||||||
|
: ['dark chocolate chip', 'ligth chocolate chip']
|
||||||
|
|
||||||
|
**** Functions and Labels
|
||||||
|
#+BEGIN_SRC python :results output
|
||||||
|
from sqlalchemy import func
|
||||||
|
|
||||||
|
s = select(func.sum(cookies.c.quantity))
|
||||||
|
rp = connection.execute(s)
|
||||||
|
print(rp.scalar())
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[8aa53360a1f7553d0919165cc2e0395cd9cdbf75]:
|
||||||
|
: 2026-09-16 19:25:14,596 INFO sqlalchemy.engine.Engine SELECT sum(cookies.quantity) AS sum_1
|
||||||
|
: FROM cookies
|
||||||
|
: 2026-09-16 19:25:14,596 INFO sqlalchemy.engine.Engine [generated in 0.00015s] ()
|
||||||
|
: 147
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results output
|
||||||
|
s = select(func.count(cookies.c.cookie_name))
|
||||||
|
rp = connection.execute(s)
|
||||||
|
record = rp.first()
|
||||||
|
print(record._fields)
|
||||||
|
print(record.count_1)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[7da8cb0840185a44ad15f744854e7ddcc43142e2]:
|
||||||
|
: 2026-09-16 19:25:14,609 INFO sqlalchemy.engine.Engine SELECT count(cookies.cookie_name) AS count_1
|
||||||
|
: FROM cookies
|
||||||
|
: 2026-09-16 19:25:14,610 INFO sqlalchemy.engine.Engine [generated in 0.00014s] ()
|
||||||
|
: ('count_1',)
|
||||||
|
: 5
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results output
|
||||||
|
s = select(func.count(cookies.c.cookie_name).label('inventory_count'))
|
||||||
|
rp = connection.execute(s)
|
||||||
|
record = rp.first()
|
||||||
|
print(record._fields)
|
||||||
|
print(record.inventory_count)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[e3ae661197627aa382aebcc7886d9dbfcc9f7648]:
|
||||||
|
: 2026-09-16 19:25:14,623 INFO sqlalchemy.engine.Engine SELECT count(cookies.cookie_name) AS inventory_count
|
||||||
|
: FROM cookies
|
||||||
|
: 2026-09-16 19:25:14,623 INFO sqlalchemy.engine.Engine [generated in 0.00015s] ()
|
||||||
|
: ('inventory_count',)
|
||||||
|
: 5
|
||||||
|
|
||||||
|
**** Filtering
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
s = select(cookies).where(cookies.c.cookie_name == "chocolate chip")
|
||||||
|
rp = connection.execute(s)
|
||||||
|
record = rp.first()
|
||||||
|
[
|
||||||
|
(k, repr(v) if hasattr(v, "quantize") else v)
|
||||||
|
for k, v in dict(record._mapping.items()).items()
|
||||||
|
]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[f9be443253c771bf63bf0e220aba3afb69fdacd8]:
|
||||||
|
| cookie_id | 1 |
|
||||||
|
| cookie_name | chocolate chip |
|
||||||
|
| cookie_recipe_url | http://some.aweso.me/cookie/recipe.html |
|
||||||
|
| cookie_sku | CC01 |
|
||||||
|
| quantity | 12 |
|
||||||
|
| unit_cost | Decimal('0.50') |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results output
|
||||||
|
s = select(cookies).where(cookies.c.cookie_name.like("%chocolate%"))
|
||||||
|
rp = connection.execute(s)
|
||||||
|
for record in rp:
|
||||||
|
print(record.cookie_name)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[7ddf89caaefaac2bc4e5dfc1c808da3262d8a6dd]:
|
||||||
|
: 2026-09-16 19:25:14,672 INFO sqlalchemy.engine.Engine SELECT cookies.cookie_id, cookies.cookie_name, cookies.cookie_recipe_url, cookies.cookie_sku, cookies.quantity, cookies.unit_cost
|
||||||
|
: FROM cookies
|
||||||
|
: WHERE cookies.cookie_name LIKE ?
|
||||||
|
: 2026-09-16 19:25:14,672 INFO sqlalchemy.engine.Engine [generated in 0.00017s] ('%chocolate%',)
|
||||||
|
: chocolate chip
|
||||||
|
: dark chocolate chip
|
||||||
|
: ligth chocolate chip
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
s = select(cookies.c.cookie_name, "SKU-" + cookies.c.cookie_sku)
|
||||||
|
[row for row in connection.execute(s)]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[5f464e9ee3e60c403cf2477cad6a17b20be05ad9]:
|
||||||
|
| chocolate chip | SKU-CC01 |
|
||||||
|
| dark chocolate chip | SKU-CC02 |
|
||||||
|
| ligth chocolate chip | SKU-CC03 |
|
||||||
|
| peanut butter | SKU-PB01 |
|
||||||
|
| oatmeal raisin | SKU-EWW01 |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
from sqlalchemy import cast
|
||||||
|
|
||||||
|
s = select(
|
||||||
|
cookies.c.cookie_name,
|
||||||
|
cast((cookies.c.quantity * cookies.c.unit_cost), Numeric(12, 2)).label("inv_cost"),
|
||||||
|
)
|
||||||
|
[(row.cookie_name, repr(row.inv_cost)) for row in connection.execute(s)]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[ca2b3c83ecfc01a7899510f79bd4631436fbb199]:
|
||||||
|
| chocolate chip | Decimal('6.00') |
|
||||||
|
| dark chocolate chip | Decimal('0.75') |
|
||||||
|
| ligth chocolate chip | Decimal('5.00') |
|
||||||
|
| peanut butter | Decimal('6.00') |
|
||||||
|
| oatmeal raisin | Decimal('100.00') |
|
||||||
|
|
||||||
|
**** Conjunctions
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
from sqlalchemy import and_, or_
|
||||||
|
|
||||||
|
s = select(cookies).where(and_(cookies.c.quantity > 23, cookies.c.unit_cost < 0.40))
|
||||||
|
[row.cookie_name for row in connection.execute(s)]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[696e8f93933efd5bc78e28b8e6de3edb94aa8e71]:
|
||||||
|
| peanut butter |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
s = select(cookies).where(
|
||||||
|
or_(cookies.c.quantity.between(10, 50), cookies.c.cookie_name.contains("chip"))
|
||||||
|
)
|
||||||
|
[(row.cookie_name,) for row in connection.execute(s)]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[3db4a872df1b72d8f67560300e527b4d065be69e]:
|
||||||
|
| chocolate chip |
|
||||||
|
| dark chocolate chip |
|
||||||
|
| ligth chocolate chip |
|
||||||
|
| peanut butter |
|
||||||
|
|
||||||
|
*** Updating Data
|
||||||
|
#+BEGIN_SRC python :results value
|
||||||
|
from sqlalchemy import update
|
||||||
|
|
||||||
|
u = update(cookies).where(cookies.c.cookie_name == "chocolate chip")
|
||||||
|
u = u.values(quantity=(cookies.c.quantity + 120))
|
||||||
|
result = connection.execute(u)
|
||||||
|
connection.commit()
|
||||||
|
result.rowcount
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[2d41dc1439f6c66b5fab0b2bcb50ef86a546facd]:
|
||||||
|
: 1
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
s = select(cookies).where(cookies.c.cookie_name == "chocolate chip")
|
||||||
|
result = connection.execute(s).first()
|
||||||
|
[
|
||||||
|
(
|
||||||
|
key,
|
||||||
|
(
|
||||||
|
repr(result._mapping[key])
|
||||||
|
if hasattr(result._mapping[key], "quantize")
|
||||||
|
else result._mapping[key]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
for key in result._mapping.keys()
|
||||||
|
]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[df3fbfc80a790c9cada7e56c8eb1cc9c44608632]:
|
||||||
|
| cookie_id | 1 |
|
||||||
|
| cookie_name | chocolate chip |
|
||||||
|
| cookie_recipe_url | http://some.aweso.me/cookie/recipe.html |
|
||||||
|
| cookie_sku | CC01 |
|
||||||
|
| quantity | 132 |
|
||||||
|
| unit_cost | Decimal('0.50') |
|
||||||
|
|
||||||
|
*** Deleting Data
|
||||||
|
#+BEGIN_SRC python :results value
|
||||||
|
from sqlalchemy import delete
|
||||||
|
|
||||||
|
u = delete(cookies).where(cookies.c.cookie_name == "dark chocolate chip")
|
||||||
|
result = connection.execute(u)
|
||||||
|
connection.commit()
|
||||||
|
result.rowcount
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[c78a60f97e57cedbde3dec71a2c7c9594cb0b821]:
|
||||||
|
: 1
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results value
|
||||||
|
s = select(cookies).where(cookies.c.cookie_name == "dark chocolate chip")
|
||||||
|
result = connection.execute(s).all()
|
||||||
|
len(result)
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[48f1fb3f9cd64941c3b6263bb9f6f6fb9b608a12]:
|
||||||
|
: 0
|
||||||
|
|
||||||
|
*** Joins
|
||||||
|
#+BEGIN_SRC python :results silent
|
||||||
|
customer_list = [
|
||||||
|
{
|
||||||
|
"username": "cookiemon",
|
||||||
|
"email_address": "mon@cookie.com",
|
||||||
|
"phone": "111-111-1111",
|
||||||
|
"password": "password",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"username": "cakeeater",
|
||||||
|
"email_address": "cakeeater@cake.com",
|
||||||
|
"phone": "222-222-2222",
|
||||||
|
"password": "password",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"username": "pieguy",
|
||||||
|
"email_address": "guy@pie.com",
|
||||||
|
"phone": "333-333-3333",
|
||||||
|
"password": "password",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
ins = users.insert()
|
||||||
|
result = connection.execute(ins, customer_list)
|
||||||
|
connection.commit()
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results none
|
||||||
|
ins = insert(orders).values(user_id=1, order_id=1)
|
||||||
|
result = connection.execute(ins)
|
||||||
|
ins = insert(line_items)
|
||||||
|
order_items = [
|
||||||
|
{"order_id": 1, "cookie_id": 1, "quantity": 2, "extended_cost": 1.00},
|
||||||
|
{"order_id": 1, "cookie_id": 3, "quantity": 12, "extended_cost": 3.00},
|
||||||
|
]
|
||||||
|
result = connection.execute(ins, order_items)
|
||||||
|
ins = insert(orders).values(user_id=2, order_id=2)
|
||||||
|
result = connection.execute(ins)
|
||||||
|
ins = insert(line_items)
|
||||||
|
order_items = [
|
||||||
|
{"order_id": 2, "cookie_id": 1, "quantity": 24, "extended_cost": 12.00},
|
||||||
|
{"order_id": 2, "cookie_id": 4, "quantity": 6, "extended_cost": 6.00},
|
||||||
|
]
|
||||||
|
result = connection.execute(ins, order_items)
|
||||||
|
connection.commit()
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
s = select(line_items)
|
||||||
|
rp = connection.execute(s)
|
||||||
|
[tuple(f for f in rp.keys())] + [row for row in rp]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[1fcc0e794bcbe7a7f531be1ad71cc89cdb0a3099]:
|
||||||
|
| line_items_id | order_id | cookie_id | quantity | extended_cost | |
|
||||||
|
| 1 | 1 | 1 | 2 | Decimal | (1.00) |
|
||||||
|
| 2 | 1 | 3 | 12 | Decimal | (3.00) |
|
||||||
|
| 3 | 2 | 1 | 24 | Decimal | (12.00) |
|
||||||
|
| 4 | 2 | 4 | 6 | Decimal | (6.00) |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
s = select(orders)
|
||||||
|
rp = connection.execute(s)
|
||||||
|
[tuple(f for f in rp.keys())] + [row for row in rp]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[ab29e60937fe14ffa13a62e686f2b1d2c38b2685]:
|
||||||
|
| order_id | user_id | shipped |
|
||||||
|
| 1 | 1 | False |
|
||||||
|
| 2 | 2 | False |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table
|
||||||
|
s = select(users)
|
||||||
|
rp = connection.execute(s)
|
||||||
|
[tuple(f for f in rp.keys())] + [row for row in rp]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS[ddc5b43682386ff382d6c09fd6af055077a29600]:
|
||||||
|
| user_id | username | email_address | phone | password | created_on | updated_on | | |
|
||||||
|
| 1 | cookiemon | mon@cookie.com | 111-111-1111 | password | datetime.datetime | (2026 9 16 19 25 14 928945) | datetime.datetime | (2026 9 16 19 25 14 928953) |
|
||||||
|
| 2 | cakeeater | cakeeater@cake.com | 222-222-2222 | password | datetime.datetime | (2026 9 16 19 25 14 928955) | datetime.datetime | (2026 9 16 19 25 14 928956) |
|
||||||
|
| 3 | pieguy | guy@pie.com | 333-333-3333 | password | datetime.datetime | (2026 9 16 19 25 14 928957) | datetime.datetime | (2026 9 16 19 25 14 928958) |
|
||||||
|
|
||||||
|
#+BEGIN_SRC python :results table :cache no
|
||||||
|
columns = [
|
||||||
|
orders.c.order_id,
|
||||||
|
users.c.username,
|
||||||
|
users.c.phone,
|
||||||
|
cookies.c.cookie_name,
|
||||||
|
line_items.c.quantity,
|
||||||
|
line_items.c.extended_cost,
|
||||||
|
]
|
||||||
|
|
||||||
|
cookiemon_orders = (
|
||||||
|
select(*columns)
|
||||||
|
.select_from(
|
||||||
|
orders
|
||||||
|
.join(users, orders.c.user_id == users.c.user_id)
|
||||||
|
.join(line_items, orders.c.order_id == line_items.c.order_id)
|
||||||
|
.join(cookies, line_items.c.cookie_id == cookies.c.cookie_id)
|
||||||
|
)
|
||||||
|
.where(users.c.username == "cookiemon")
|
||||||
|
)
|
||||||
|
result = connection.execute(cookiemon_orders)
|
||||||
|
[row for row in result]
|
||||||
|
#+END_SRC
|
||||||
|
|
||||||
|
#+RESULTS:
|
||||||
|
| 1 | cookiemon | 111-111-1111 | chocolate chip | 2 | Decimal | (1.00) |
|
||||||
|
| 1 | cookiemon | 111-111-1111 | ligth chocolate chip | 12 | Decimal | (3.00) |
|
||||||
|
|||||||
Reference in New Issue
Block a user