Release: 2.0.41 | Release Date: May 14, 2025

# SQLAlchemy 2.0 Documentation

# Source code for examples.dogpile_caching.fixture_data

    """Installs some sample data.   Here we have a handful of postal codes for
    a few US/Canadian cities.   Then, 100 Person records are installed, each
    with a randomly selected postal code.

    """

    import random

    from .environment import Base
    from .environment import Session
    from .model import Address
    from .model import City
    from .model import Country
    from .model import Person
    from .model import PostalCode

    def install():
        Base.metadata.create_all(Session().bind)

        data = [
            ("Chicago", "United States", ("60601", "60602", "60603", "60604")),
            ("Montreal", "Canada", ("H2S 3K9", "H2B 1V4", "H7G 2T8")),
            ("Edmonton", "Canada", ("T5J 1R9", "T5J 1Z4", "T5H 1P6")),
            (
                "New York",
                "United States",
                ("10001", "10002", "10003", "10004", "10005", "10006"),
            ),
            (
                "San Francisco",
                "United States",
                ("94102", "94103", "94104", "94105", "94107", "94108"),
            ),
        ]

        countries = {}
        all_post_codes = []
        for city, country, postcodes in data:
            try:
                country = countries[country]
            except KeyError:
                countries[country] = country = Country(country)

            city = City(city, country)
            pc = [PostalCode(code, city) for code in postcodes]
            Session.add_all(pc)
            all_post_codes.extend(pc)

        for i in range(1, 51):
            person = Person(
                "person %.2d" % i,
                Address(
                    street="street %.2d" % i,
                    postal_code=all_post_codes[
                        random.randint(0, len(all_post_codes) - 1)
                    ],
                ),
            )
            Session.add(person)

        Session.commit()

        # start the demo fresh
        Session.remove()