Lesson 2 — Customers, dated invoices, amounts and relationship paths

All people, products and invoices are fictional teaching data.
Unzip this bundle. Put its four CSV files in the Python console's current
working folder, then type console.py in order in the SAME console as lesson 1.
If Python was closed, first run from the extracted folder:
    exec(open("start-here.py").read())
The bootstrap recreates exactly the lesson-one state: three products in memory.
The CSV files are inputs; no model or database files are created.
Do not repeat imports in a populated session: the keys are intentionally unique.

Files and results:
- products.csv: 27 NEW products; TEA, COF and MUG already exist from lesson 1.
  After import the catalogue has 30 products.
- customers.csv: 8 customers, with city.
- invoices.csv: 12 invoices; invoice_date uses ISO YYYY-MM-DD format.
- invoice_rows.csv: 36 rows with quantity, unit_price and total. Prices and totals
  are decimal text. Fixture totals equal quantity * unit_price, rounded to
  two decimal places before import. All amounts use one assumed
  currency; this introductory example excludes tax, discounts and conversions.

Import order: products, customers, invoices, invoice rows.
Pass each open CSV file to table.sql_insert(source). Types are adapted from
the model: integer keys/quantities, ISO dates and Decimal amounts. This is a raw
SQL import without Python triggers. Commit each complete file import.
unit_price is saved on the invoice row. total is an ordinary stored numeric
column, already populated in the CSV. Recalculate total whenever changing a
row's quantity or unit_price; it is not an automatic formula column.
These are deliberately small, valid fixtures, not a general CSV importer.

Paths:
    @customer_id.city
    @product_code.name
    @invoice_id.@customer_id.city
    @invoice_id.invoice_date
SQL foreign keys reject missing products. Relation paths compile to joins.

Requires Asqueel 0.6.0 with its migration extra. See /status/#course for the
verified package versions.
The video reconstructs verified commands/results with edited timing.
