Skip to content

Commit

Permalink
Started the docs with a meaty example
Browse files Browse the repository at this point in the history
  • Loading branch information
Simon Willison committed Jul 28, 2018
1 parent e51f36d commit 29c897b
Showing 1 changed file with 103 additions and 3 deletions.
106 changes: 103 additions & 3 deletions docs/index.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,106 @@
sqlite-utils
============
==============
sqlite-utils
==============

*Python utility functions for manipulating SQLite databases*

Work in progress.
This library aims to make creating a SQLite database from a collection of data as easy as possible.

It is not intended to be a full ORM: the focus is utility helpers to make creating the initial database and populating it with data as productive as possible.

In lieu of detailed documentation (coming soon), enjoy an example instead:

.. code-block:: python
from sqlite_utils import db
import sqlite3
import requests
import hashlib
import json
raw_ads = requests.get(
"https://raw.githubusercontent.com/edsu/irads/master/ads.json"
).json()
print(raw_ads[0])
# {'clicks': 32,
# 'created': '2016-11-14T04:10:27-08:00',
# 'ended': None,
# 'file': 'data/2016-11/P(1)0001720.pdf',
# 'id': 3186,
# 'impressions': 396,
# 'spend': {'amount': '1050.77', 'currency': 'RUB'},
# 'targeting': {'age': ['18 - 65+'],
# 'excluded_connections': ['Exclude people who like Black guns matter'],
# 'language': ['English (UK)', 'English (US)'],
# 'location': ['United States'],
# 'people_who_match': {'interests': ['Martin Luther King',
# 'Jr.',
# '2nd Amendment',
# 'National Rifle Association',
# 'African-American culture',
# 'African-American Civil Rights Movement (1954—68)',
# 'Gun Owners of America',
# 'African—American history',
# 'Second Amendment to the United States Constitution',
# 'Concealed carry in the United States',
# 'Firearm',
# 'Malcolm X']},
# 'placements': ['News Feed on desktop computers',
# 'News Feed on mobile devices',
# 'Right column on desktop computers']},
# 'text': 'Black American racial experience is real. We support the 2nd ammendment\nfor our safety.\n\n',
# 'url': 'https://www.facebook.com/ProtectBIackGunOwners/'}
def flatten_targeting(targeting, prefix=''):
# Convert targeting nested dictionary into list of strings
# e.g. people_who_match:interests:Martin Luther King
if isinstance(targeting, list) and all(isinstance(s, str) for s in targeting):
return ["{}:{}".format(prefix, item) for item in targeting]
elif isinstance(targeting, str):
return ["{}:{}".format(prefix, targeting)]
elif isinstance(targeting, dict):
items = []
for key, value in targeting.items():
new_prefix = "{}:{}".format(prefix, key) if prefix else key
items.extend(flatten_targeting(value, new_prefix))
return items
def hash_id(s):
return hashlib.md5(s.encode("utf8")).hexdigest()[:5]
database = db.Database(sqlite3.connect("/tmp/ads3.db"))
ads = database["ads"]
targets = database["targets"]
ad_targets = database["ad_targets"]
for ad in raw_ads:
record = {
"id": ad["id"],
"file": ad["file"],
"clicks": ad["clicks"],
"impressions": ad["impressions"],
"text": ad["text"],
"url": (ad["url"] or "").replace("httpszll", "https://"),
"spend_amount": ad["spend"]["amount"],
"spend_currency": ad["spend"]["currency"] or "USD",
"created": ad["created"],
"ended": ad["ended"],
}
ads.upsert(record, pk="id")
for target in flatten_targeting(ad["targeting"]):
target_id = hash_id(target)
targets.upsert({
"id": target_id,
"name": target,
"category": target.split(":")[0],
"prefix": target.rsplit(":", 1)[0]},
pk="id"
)
ad_targets.insert({
"target_id": target_id,
"ad_id": ad["id"],
}, foreign_keys=(
("ad_id", "INTEGER", "ads", "id"),
("target_id", "TEXT", "targets", "id"),
))

0 comments on commit 29c897b

Please sign in to comment.