<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Python on Joe Bylund</title><link>http://jbylund.github.io/tags/python/</link><description>Recent content in Python on Joe Bylund</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>© 2026 Joe Bylund</copyright><lastBuildDate>Tue, 28 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://jbylund.github.io/tags/python/index.xml" rel="self" type="application/rss+xml"/><item><title>PostgreSQL COPY Loading: Faster Bulk Import</title><link>http://jbylund.github.io/posts/00160_postgres-copy-loading/</link><pubDate>Tue, 28 Jul 2026 00:00:00 +0000</pubDate><guid>http://jbylund.github.io/posts/00160_postgres-copy-loading/</guid><description>Switching from row-by-row inserts to PostgreSQL&amp;rsquo;s COPY protocol meaningfully cut import time. Why COPY is fast, how to stream data into it from Python, and two approaches to expanding a JSON blob into a typed row.</description></item><item><title>Compiling a Query AST to Parameterized SQL</title><link>http://jbylund.github.io/posts/00128_compiling-ast-to-sql/</link><pubDate>Tue, 14 Jul 2026 00:00:00 +0000</pubDate><guid>http://jbylund.github.io/posts/00128_compiling-ast-to-sql/</guid><description>Each AST node emits a SQL fragment and bound parameters. How the node hierarchy works, how different field types generate different SQL, and why user input never touches the query string. Covers text/regex/arithmetic; JSONB operators and the count+results CTE are in separate posts.</description></item><item><title>Whitespace as an Operator: Parsing Scryfall's Implicit AND</title><link>http://jbylund.github.io/posts/00112_implicit-and-query-balancing/</link><pubDate>Tue, 07 Jul 2026 00:00:00 +0000</pubDate><guid>http://jbylund.github.io/posts/00112_implicit-and-query-balancing/</guid><description>The Scryfall query language implicitly ANDs adjacent terms — pyparsing does not. This post covers the preprocessing layer built on top: implicit AND injection, query balancing in two languages, and the edge cases that required fixes.</description></item><item><title>Choosing a Parser for a Query DSL: Regex, ANTLR, Lark, and pyparsing</title><link>http://jbylund.github.io/posts/00096_query-dsl-with-pyparsing/</link><pubDate>Fri, 03 Jul 2026 00:00:00 +0000</pubDate><guid>http://jbylund.github.io/posts/00096_query-dsl-with-pyparsing/</guid><description>How I evaluated parsing approaches for Scryfall&amp;rsquo;s query language: why regex and ANTLR were ruled out, how Lark compares to pyparsing, and why pyparsing won.</description></item><item><title>13× the Throughput of FastAPI: Why I Use Falcon + Bjoern</title><link>http://jbylund.github.io/posts/00064_falcon-bjoern-web-framework/</link><pubDate>Sat, 27 Jun 2026 00:00:00 +0000</pubDate><guid>http://jbylund.github.io/posts/00064_falcon-bjoern-web-framework/</guid><description>Why Sylvan Librarian uses Falcon and Bjoern instead of the FastAPI + uvicorn default: a preference for explicit, close-to-vanilla Python over framework magic.</description></item><item><title>The Query Scryfall Can't Answer: `power+toughness&gt;cmc+cmc`</title><link>http://jbylund.github.io/posts/00032_why-build-a-self-hosted-scryfall/</link><pubDate>Sat, 20 Jun 2026 00:00:00 +0000</pubDate><guid>http://jbylund.github.io/posts/00032_why-build-a-self-hosted-scryfall/</guid><description>Motivation for building Sylvan Librarian: owning the query language, and the killer feature Scryfall can&amp;rsquo;t do — arithmetic comparisons across card attributes.</description></item></channel></rss>