From 63f24316b5b042d1cb6fe01528d800fdd5281f0a Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Fri, 22 Jun 2018 17:59:53 -0700 Subject: Update source files for installation step with new alembic support --- docs/tutorials/wiki2/src/installation/.gitignore | 21 ++++++++ docs/tutorials/wiki2/src/installation/README.txt | 14 +++++- .../wiki2/src/installation/development.ini | 6 +++ .../wiki2/src/installation/production.ini | 6 +++ docs/tutorials/wiki2/src/installation/pytest.ini | 2 +- docs/tutorials/wiki2/src/installation/setup.py | 3 +- .../wiki2/src/installation/tutorial/alembic/env.py | 58 ++++++++++++++++++++++ .../installation/tutorial/alembic/script.py.mako | 24 +++++++++ .../tutorial/alembic/versions/README.txt | 1 + .../installation/tutorial/scripts/initialize_db.py | 44 ++++++++++++++++ .../installation/tutorial/scripts/initializedb.py | 45 ----------------- .../tutorial/templates/mytemplate.jinja2 | 2 +- .../src/installation/tutorial/views/default.py | 5 +- 13 files changed, 178 insertions(+), 53 deletions(-) create mode 100644 docs/tutorials/wiki2/src/installation/.gitignore create mode 100644 docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py create mode 100644 docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako create mode 100644 docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt create mode 100644 docs/tutorials/wiki2/src/installation/tutorial/scripts/initialize_db.py delete mode 100644 docs/tutorials/wiki2/src/installation/tutorial/scripts/initializedb.py (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/installation/.gitignore b/docs/tutorials/wiki2/src/installation/.gitignore new file mode 100644 index 000000000..1853d983c --- /dev/null +++ b/docs/tutorials/wiki2/src/installation/.gitignore @@ -0,0 +1,21 @@ +*.egg +*.egg-info +*.pyc +*$py.class +*~ +.coverage +coverage.xml +build/ +dist/ +.tox/ +nosetests.xml +env*/ +tmp/ +Data.fs* +*.sublime-project +*.sublime-workspace +.*.sw? +.sw? +.DS_Store +coverage +test diff --git a/docs/tutorials/wiki2/src/installation/README.txt b/docs/tutorials/wiki2/src/installation/README.txt index 7b33da610..6d2df698e 100644 --- a/docs/tutorials/wiki2/src/installation/README.txt +++ b/docs/tutorials/wiki2/src/installation/README.txt @@ -20,9 +20,19 @@ Getting Started env/bin/pip install -e ".[testing]" -- Configure the database. +- Initialize the database using Alembic. - env/bin/initialize_tutorial_db development.ini + - Generate your first revision. + + env/bin/alembic -c development.ini revision --autogenerate -m "init" + + - Upgrade to that revision. + + env/bin/alembic -c development.ini upgrade head + + - Load default data. + + env/bin/initialize_tutorial_db development.ini - Run your project's tests. diff --git a/docs/tutorials/wiki2/src/installation/development.ini b/docs/tutorials/wiki2/src/installation/development.ini index 4a67896b2..ee050c0ea 100644 --- a/docs/tutorials/wiki2/src/installation/development.ini +++ b/docs/tutorials/wiki2/src/installation/development.ini @@ -26,6 +26,12 @@ retry.attempts = 3 # wsgi server configuration ### +[alembic] +# path to migration scripts +script_location = tutorial/alembic +file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s +# file_template = %%(rev)s_%%(slug)s + [server:main] use = egg:waitress#main listen = localhost:6543 diff --git a/docs/tutorials/wiki2/src/installation/production.ini b/docs/tutorials/wiki2/src/installation/production.ini index a28e47a83..91d0f5ddb 100644 --- a/docs/tutorials/wiki2/src/installation/production.ini +++ b/docs/tutorials/wiki2/src/installation/production.ini @@ -20,6 +20,12 @@ retry.attempts = 3 # wsgi server configuration ### +[alembic] +# path to migration scripts +script_location = tutorial/alembic +file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s +# file_template = %%(rev)s_%%(slug)s + [server:main] use = egg:waitress#main listen = *:6543 diff --git a/docs/tutorials/wiki2/src/installation/pytest.ini b/docs/tutorials/wiki2/src/installation/pytest.ini index 8b76bc410..a3489cdf8 100644 --- a/docs/tutorials/wiki2/src/installation/pytest.ini +++ b/docs/tutorials/wiki2/src/installation/pytest.ini @@ -1,3 +1,3 @@ [pytest] testpaths = tutorial -python_files = *.py +python_files = test*.py diff --git a/docs/tutorials/wiki2/src/installation/setup.py b/docs/tutorials/wiki2/src/installation/setup.py index 9fc5519a5..1638ef28e 100644 --- a/docs/tutorials/wiki2/src/installation/setup.py +++ b/docs/tutorials/wiki2/src/installation/setup.py @@ -9,6 +9,7 @@ with open(os.path.join(here, 'CHANGES.txt')) as f: CHANGES = f.read() requires = [ + 'alembic', 'plaster_pastedeploy', 'pyramid >= 1.9a', 'pyramid_debugtoolbar', @@ -54,7 +55,7 @@ setup( 'main = tutorial:main', ], 'console_scripts': [ - 'initialize_tutorial_db = tutorial.scripts.initializedb:main', + 'initialize_tutorial_db = tutorial.scripts.initialize_db:main', ], }, ) diff --git a/docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py b/docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py new file mode 100644 index 000000000..730785899 --- /dev/null +++ b/docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py @@ -0,0 +1,58 @@ +"""Pyramid bootstrap environment. """ +from alembic import context +from pyramid.paster import get_appsettings, setup_logging + +from tutorial.models import get_engine +from tutorial.models.meta import Base + +config = context.config + +setup_logging(config.config_file_name) + +settings = get_appsettings(config.config_file_name) +target_metadata = Base.metadata + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + context.configure(url=settings['sqlalchemy.url']) + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + engine = get_engine(settings) + + connection = engine.connect() + context.configure( + connection=connection, + target_metadata=target_metadata + ) + + try: + with context.begin_transaction(): + context.run_migrations() + finally: + connection.close() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako new file mode 100644 index 000000000..2c0156303 --- /dev/null +++ b/docs/tutorials/wiki2/src/installation/tutorial/alembic/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt new file mode 100644 index 000000000..09ed32c8d --- /dev/null +++ b/docs/tutorials/wiki2/src/installation/tutorial/alembic/versions/README.txt @@ -0,0 +1 @@ +Placeholder for alembic versions \ No newline at end of file diff --git a/docs/tutorials/wiki2/src/installation/tutorial/scripts/initialize_db.py b/docs/tutorials/wiki2/src/installation/tutorial/scripts/initialize_db.py new file mode 100644 index 000000000..5b129e761 --- /dev/null +++ b/docs/tutorials/wiki2/src/installation/tutorial/scripts/initialize_db.py @@ -0,0 +1,44 @@ +import os +import sys + +from pyramid.paster import bootstrap, setup_logging +from sqlalchemy.exc import OperationalError + +from .. import models + + +def setup_models(dbsession): + model = models.MyModel(name='one', value=1) + dbsession.add(model) + + +def usage(argv): + cmd = os.path.basename(argv[0]) + print('usage: %s \n' + '(example: "%s development.ini")' % (cmd, cmd)) + sys.exit(1) + + +def main(argv=sys.argv): + if len(argv) != 2: + usage(argv) + config_uri = argv[1] + setup_logging(config_uri) + env = bootstrap(config_uri) + + try: + with env['request'].tm: + dbsession = env['request'].dbsession + setup_models(dbsession) + except OperationalError: + print(''' +Pyramid is having a problem using your SQL database. The problem +might be caused by one of the following things: + +1. You may need to initialize your database tables with `alembic`. + Check your README.txt for description and try to run it. + +2. Your database server may not be running. Check that the + database server referred to by the "sqlalchemy.url" setting in + your "development.ini" file is running. + ''') diff --git a/docs/tutorials/wiki2/src/installation/tutorial/scripts/initializedb.py b/docs/tutorials/wiki2/src/installation/tutorial/scripts/initializedb.py deleted file mode 100644 index 7307ecc5c..000000000 --- a/docs/tutorials/wiki2/src/installation/tutorial/scripts/initializedb.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import sys -import transaction - -from pyramid.paster import ( - get_appsettings, - setup_logging, - ) - -from pyramid.scripts.common import parse_vars - -from ..models.meta import Base -from ..models import ( - get_engine, - get_session_factory, - get_tm_session, - ) -from ..models import MyModel - - -def usage(argv): - cmd = os.path.basename(argv[0]) - print('usage: %s [var=value]\n' - '(example: "%s development.ini")' % (cmd, cmd)) - sys.exit(1) - - -def main(argv=sys.argv): - if len(argv) < 2: - usage(argv) - config_uri = argv[1] - options = parse_vars(argv[2:]) - setup_logging(config_uri) - settings = get_appsettings(config_uri, options=options) - - engine = get_engine(settings) - Base.metadata.create_all(engine) - - session_factory = get_session_factory(engine) - - with transaction.manager: - dbsession = get_tm_session(session_factory, transaction.manager) - - model = MyModel(name='one', value=1) - dbsession.add(model) diff --git a/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 b/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 index 26d72c0a6..d8b0a4232 100644 --- a/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 +++ b/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 @@ -5,4 +5,4 @@

Pyramid Alchemy project

Welcome to {{project}}, a Pyramid application generated by
Cookiecutter.

-{% endblock content %} +{% endblock content %} \ No newline at end of file diff --git a/docs/tutorials/wiki2/src/installation/tutorial/views/default.py b/docs/tutorials/wiki2/src/installation/tutorial/views/default.py index a404d4154..f8793ffb5 100644 --- a/docs/tutorials/wiki2/src/installation/tutorial/views/default.py +++ b/docs/tutorials/wiki2/src/installation/tutorial/views/default.py @@ -20,9 +20,8 @@ db_err_msg = """\ Pyramid is having a problem using your SQL database. The problem might be caused by one of the following things: -1. You may need to run the "initialize_tutorial_db" script - to initialize your database tables. Check your virtual - environment's "bin" directory for this script and try to run it. +1. You may need to initialize your database tables with `alembic`. + Check your README.txt for description and try to run it. 2. Your database server may not be running. Check that the database server referred to by the "sqlalchemy.url" setting in -- cgit v1.2.3 From 8b43919a98177d4591736c3125b79ab0eeed290f Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Fri, 22 Jun 2018 18:09:59 -0700 Subject: Update source files for basiclayout step for Alembic support --- docs/tutorials/wiki2/src/basiclayout/README.txt | 14 ++++++- .../wiki2/src/basiclayout/development.ini | 6 +++ .../tutorials/wiki2/src/basiclayout/production.ini | 6 +++ docs/tutorials/wiki2/src/basiclayout/pytest.ini | 2 +- docs/tutorials/wiki2/src/basiclayout/setup.py | 3 +- .../basiclayout/tutorial/scripts/initializedb.py | 45 ---------------------- .../src/basiclayout/tutorial/views/default.py | 5 +-- .../tutorial/templates/mytemplate.jinja2 | 2 +- 8 files changed, 30 insertions(+), 53 deletions(-) delete mode 100644 docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initializedb.py (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/basiclayout/README.txt b/docs/tutorials/wiki2/src/basiclayout/README.txt index 7b33da610..6d2df698e 100644 --- a/docs/tutorials/wiki2/src/basiclayout/README.txt +++ b/docs/tutorials/wiki2/src/basiclayout/README.txt @@ -20,9 +20,19 @@ Getting Started env/bin/pip install -e ".[testing]" -- Configure the database. +- Initialize the database using Alembic. - env/bin/initialize_tutorial_db development.ini + - Generate your first revision. + + env/bin/alembic -c development.ini revision --autogenerate -m "init" + + - Upgrade to that revision. + + env/bin/alembic -c development.ini upgrade head + + - Load default data. + + env/bin/initialize_tutorial_db development.ini - Run your project's tests. diff --git a/docs/tutorials/wiki2/src/basiclayout/development.ini b/docs/tutorials/wiki2/src/basiclayout/development.ini index 4a67896b2..ee050c0ea 100644 --- a/docs/tutorials/wiki2/src/basiclayout/development.ini +++ b/docs/tutorials/wiki2/src/basiclayout/development.ini @@ -26,6 +26,12 @@ retry.attempts = 3 # wsgi server configuration ### +[alembic] +# path to migration scripts +script_location = tutorial/alembic +file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s +# file_template = %%(rev)s_%%(slug)s + [server:main] use = egg:waitress#main listen = localhost:6543 diff --git a/docs/tutorials/wiki2/src/basiclayout/production.ini b/docs/tutorials/wiki2/src/basiclayout/production.ini index a28e47a83..91d0f5ddb 100644 --- a/docs/tutorials/wiki2/src/basiclayout/production.ini +++ b/docs/tutorials/wiki2/src/basiclayout/production.ini @@ -20,6 +20,12 @@ retry.attempts = 3 # wsgi server configuration ### +[alembic] +# path to migration scripts +script_location = tutorial/alembic +file_template = %%(year)d%%(month).2d%%(day).2d_%%(rev)s +# file_template = %%(rev)s_%%(slug)s + [server:main] use = egg:waitress#main listen = *:6543 diff --git a/docs/tutorials/wiki2/src/basiclayout/pytest.ini b/docs/tutorials/wiki2/src/basiclayout/pytest.ini index 8b76bc410..a3489cdf8 100644 --- a/docs/tutorials/wiki2/src/basiclayout/pytest.ini +++ b/docs/tutorials/wiki2/src/basiclayout/pytest.ini @@ -1,3 +1,3 @@ [pytest] testpaths = tutorial -python_files = *.py +python_files = test*.py diff --git a/docs/tutorials/wiki2/src/basiclayout/setup.py b/docs/tutorials/wiki2/src/basiclayout/setup.py index 9fc5519a5..1638ef28e 100644 --- a/docs/tutorials/wiki2/src/basiclayout/setup.py +++ b/docs/tutorials/wiki2/src/basiclayout/setup.py @@ -9,6 +9,7 @@ with open(os.path.join(here, 'CHANGES.txt')) as f: CHANGES = f.read() requires = [ + 'alembic', 'plaster_pastedeploy', 'pyramid >= 1.9a', 'pyramid_debugtoolbar', @@ -54,7 +55,7 @@ setup( 'main = tutorial:main', ], 'console_scripts': [ - 'initialize_tutorial_db = tutorial.scripts.initializedb:main', + 'initialize_tutorial_db = tutorial.scripts.initialize_db:main', ], }, ) diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initializedb.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initializedb.py deleted file mode 100644 index 7307ecc5c..000000000 --- a/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initializedb.py +++ /dev/null @@ -1,45 +0,0 @@ -import os -import sys -import transaction - -from pyramid.paster import ( - get_appsettings, - setup_logging, - ) - -from pyramid.scripts.common import parse_vars - -from ..models.meta import Base -from ..models import ( - get_engine, - get_session_factory, - get_tm_session, - ) -from ..models import MyModel - - -def usage(argv): - cmd = os.path.basename(argv[0]) - print('usage: %s [var=value]\n' - '(example: "%s development.ini")' % (cmd, cmd)) - sys.exit(1) - - -def main(argv=sys.argv): - if len(argv) < 2: - usage(argv) - config_uri = argv[1] - options = parse_vars(argv[2:]) - setup_logging(config_uri) - settings = get_appsettings(config_uri, options=options) - - engine = get_engine(settings) - Base.metadata.create_all(engine) - - session_factory = get_session_factory(engine) - - with transaction.manager: - dbsession = get_tm_session(session_factory, transaction.manager) - - model = MyModel(name='one', value=1) - dbsession.add(model) diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py index a404d4154..f8793ffb5 100644 --- a/docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/views/default.py @@ -20,9 +20,8 @@ db_err_msg = """\ Pyramid is having a problem using your SQL database. The problem might be caused by one of the following things: -1. You may need to run the "initialize_tutorial_db" script - to initialize your database tables. Check your virtual - environment's "bin" directory for this script and try to run it. +1. You may need to initialize your database tables with `alembic`. + Check your README.txt for description and try to run it. 2. Your database server may not be running. Check that the database server referred to by the "sqlalchemy.url" setting in diff --git a/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 b/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 index d8b0a4232..26d72c0a6 100644 --- a/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 +++ b/docs/tutorials/wiki2/src/installation/tutorial/templates/mytemplate.jinja2 @@ -5,4 +5,4 @@

Pyramid Alchemy project

Welcome to {{project}}, a Pyramid application generated by
Cookiecutter.

-{% endblock content %} \ No newline at end of file +{% endblock content %} -- cgit v1.2.3 From c8f3bf5a70ff74a509a7ec4721797e407a31d507 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Fri, 22 Jun 2018 18:22:21 -0700 Subject: Add mention of migrations and Alembic in design and glossary. --- docs/tutorials/wiki2/design.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/design.rst b/docs/tutorials/wiki2/design.rst index 515aff276..e3b35d24a 100644 --- a/docs/tutorials/wiki2/design.rst +++ b/docs/tutorials/wiki2/design.rst @@ -19,7 +19,7 @@ Models ====== We'll be using an SQLite database to hold our wiki data, and we'll be using -:term:`SQLAlchemy` to access the data in this database. +:term:`SQLAlchemy` to access the data in this database. We will also use :term:`Alembic` for database migrations, including initialization of the SQLite database. Within the database, we will define two tables: -- cgit v1.2.3 From 487df3c860346b02b6c69f8c0fed528fc5e7084a Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Mon, 25 Jun 2018 14:40:05 -0700 Subject: Synch up readmes with cookiecutter --- docs/tutorials/wiki2/src/basiclayout/README.txt | 6 +++--- docs/tutorials/wiki2/src/installation/README.txt | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/basiclayout/README.txt b/docs/tutorials/wiki2/src/basiclayout/README.txt index 6d2df698e..5d5133e34 100644 --- a/docs/tutorials/wiki2/src/basiclayout/README.txt +++ b/docs/tutorials/wiki2/src/basiclayout/README.txt @@ -20,7 +20,7 @@ Getting Started env/bin/pip install -e ".[testing]" -- Initialize the database using Alembic. +- Initialize and upgrade the database using Alembic. - Generate your first revision. @@ -30,9 +30,9 @@ Getting Started env/bin/alembic -c development.ini upgrade head - - Load default data. +- Load default data into the database using a script. - env/bin/initialize_tutorial_db development.ini + env/bin/initialize_tutorial_db development.ini - Run your project's tests. diff --git a/docs/tutorials/wiki2/src/installation/README.txt b/docs/tutorials/wiki2/src/installation/README.txt index 6d2df698e..5d5133e34 100644 --- a/docs/tutorials/wiki2/src/installation/README.txt +++ b/docs/tutorials/wiki2/src/installation/README.txt @@ -20,7 +20,7 @@ Getting Started env/bin/pip install -e ".[testing]" -- Initialize the database using Alembic. +- Initialize and upgrade the database using Alembic. - Generate your first revision. @@ -30,9 +30,9 @@ Getting Started env/bin/alembic -c development.ini upgrade head - - Load default data. +- Load default data into the database using a script. - env/bin/initialize_tutorial_db development.ini + env/bin/initialize_tutorial_db development.ini - Run your project's tests. -- cgit v1.2.3 From a0cdd7b3a9059cc3fd57f084940174014e6d2c1c Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Mon, 25 Jun 2018 14:40:28 -0700 Subject: add missing .gitignore --- docs/tutorials/wiki2/src/basiclayout/.gitignore | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 docs/tutorials/wiki2/src/basiclayout/.gitignore (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/basiclayout/.gitignore b/docs/tutorials/wiki2/src/basiclayout/.gitignore new file mode 100644 index 000000000..1853d983c --- /dev/null +++ b/docs/tutorials/wiki2/src/basiclayout/.gitignore @@ -0,0 +1,21 @@ +*.egg +*.egg-info +*.pyc +*$py.class +*~ +.coverage +coverage.xml +build/ +dist/ +.tox/ +nosetests.xml +env*/ +tmp/ +Data.fs* +*.sublime-project +*.sublime-workspace +.*.sw? +.sw? +.DS_Store +coverage +test -- cgit v1.2.3 From 49620d9f7a14fa1b5c46348578c3b40823e85907 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Mon, 25 Jun 2018 17:09:18 -0700 Subject: Add Alembic and clarify console script in Installation step --- docs/tutorials/wiki2/installation.rst | 243 ++++++++++++++++++++++------------ 1 file changed, 160 insertions(+), 83 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/installation.rst b/docs/tutorials/wiki2/installation.rst index 5a935f7fc..9b89327cb 100644 --- a/docs/tutorials/wiki2/installation.rst +++ b/docs/tutorials/wiki2/installation.rst @@ -198,6 +198,143 @@ Testing requirements are defined in our project's ``setup.py`` file, in the ``te :lines: 48-50 +.. _initialize_db_wiki2: + +Initialize and upgrade the database using Alembic +------------------------------------------------- + +We use :term:`Alembic` to manage our database initialization and migrations. + +Generate your first revision. + +On UNIX +^^^^^^^ + +.. code-block:: bash + + $ $VENV/bin/alembic -c development.ini revision --autogenerate -m "init" + +On Windows +^^^^^^^^^^ + +.. code-block:: doscon + + c:\tutorial> %VENV%\Scripts\alembic -c development.ini revision --autogenerate -m "init" + +The output to your console should be something like this: + +.. code-block:: text + + 2018-06-22 17:57:31,587 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 + 2018-06-22 17:57:31,587 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-22 17:57:31,588 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 + 2018-06-22 17:57:31,588 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-22 17:57:31,589 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version") + 2018-06-22 17:57:31,589 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:31,590 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version") + 2018-06-22 17:57:31,590 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:31,590 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] + CREATE TABLE alembic_version ( + version_num VARCHAR(32) NOT NULL, + CONSTRAINT alembic_version_pkc PRIMARY KEY (version_num) + ) + + + 2018-06-22 17:57:31,591 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:31,591 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + 2018-06-22 17:57:31,594 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT name FROM sqlite_master WHERE type='table' ORDER BY name + 2018-06-22 17:57:31,594 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + Generating //tutorial/alembic/versions/20180622_bab5a278ce04.py ... done + +Upgrade to that revision. + +On UNIX +^^^^^^^ + +.. code-block:: bash + + $ $VENV/bin/alembic -c development.ini upgrade head + +On Windows +^^^^^^^^^^ + +.. code-block:: doscon + + c:\tutorial> %VENV%\Scripts\alembic -c development.ini upgrade head + +The output to your console should be something like this: + +.. code-block:: text + + 2018-06-22 17:57:37,814 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 + 2018-06-22 17:57:37,814 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-22 17:57:37,814 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 + 2018-06-22 17:57:37,814 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-22 17:57:37,816 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version") + 2018-06-22 17:57:37,816 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:37,817 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT alembic_version.version_num + FROM alembic_version + 2018-06-22 17:57:37,817 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:37,817 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version") + 2018-06-22 17:57:37,817 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:37,819 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] + CREATE TABLE models ( + id INTEGER NOT NULL, + name TEXT, + value INTEGER, + CONSTRAINT pk_models PRIMARY KEY (id) + ) + + + 2018-06-22 17:57:37,820 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:37,822 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + 2018-06-22 17:57:37,824 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] CREATE UNIQUE INDEX my_index ON models (name) + 2018-06-22 17:57:37,824 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:37,825 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + 2018-06-22 17:57:37,825 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] INSERT INTO alembic_version (version_num) VALUES ('bab5a278ce04') + 2018-06-22 17:57:37,825 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-22 17:57:37,825 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + + +.. _load_data_wiki2: + +Load default data +----------------- + +Load default data into the database using a :term:`console script`. Type the following command, making sure you are still in the ``tutorial`` directory (the directory with a ``development.ini`` in it): + +On UNIX +^^^^^^^ + +.. code-block:: bash + + $ $VENV/bin/initialize_tutorial_db development.ini + +On Windows +^^^^^^^^^^ + +.. code-block:: doscon + + c:\tutorial> %VENV%\Scripts\initialize_tutorial_db development.ini + +The output to your console should be something like this: + +.. code-block:: bash + + 2018-06-22 17:57:46,241 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 + 2018-06-22 17:57:46,241 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-22 17:57:46,242 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 + 2018-06-22 17:57:46,242 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-22 17:57:46,243 INFO [sqlalchemy.engine.base.Engine:682][MainThread] BEGIN (implicit) + 2018-06-22 17:57:46,244 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] INSERT INTO models (name, value) VALUES (?, ?) + 2018-06-22 17:57:46,245 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] ('one', 1) + 2018-06-22 17:57:46,246 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + +Success! You should now have a ``tutorial.sqlite`` file in your current +working directory. This is an SQLite database with a single table defined in it +(``models``) and single record inside of that. + + .. _sql_running_tests: Run the tests @@ -260,27 +397,28 @@ If successful, you will see output something like this: .. code-block:: bash ======================== test session starts ======================== - platform Python 3.6.0, pytest-3.0.5, py-1.4.31, pluggy-0.4.0 - rootdir: /Users/stevepiercy/tutorial, inifile: - plugins: cov-2.4.0 + platform Python 3.6.5, pytest-3.6.2, py-1.5.3, pluggy-0.6.0 + rootdir: //tutorial, inifile: pytest.ini + plugins: cov-2.5.1 collected 2 items tutorial/tests.py .. - ------------------ coverage: platform Python 3.6.0 ------------------ - Name Stmts Miss Cover Missing - ---------------------------------------------------------------- - tutorial/__init__.py 8 6 25% 7-12 - tutorial/models/__init__.py 22 0 100% - tutorial/models/meta.py 5 0 100% - tutorial/models/mymodel.py 8 0 100% - tutorial/routes.py 3 2 33% 2-3 - tutorial/scripts/__init__.py 0 0 100% - tutorial/scripts/initializedb.py 26 16 38% 22-25, 29-45 - tutorial/views/__init__.py 0 0 100% - tutorial/views/default.py 12 0 100% - tutorial/views/notfound.py 4 2 50% 6-7 - ---------------------------------------------------------------- - TOTAL 88 26 70% + ------------------ coverage: platform Python 3.6.5 ------------------ + Name Stmts Miss Cover Missing + ----------------------------------------------------------------- + tutorial/__init__.py 8 6 25% 7-12 + tutorial/models/__init__.py 24 0 100% + tutorial/models/meta.py 5 0 100% + tutorial/models/mymodel.py 8 0 100% + tutorial/routes.py 3 3 0% 1-3 + tutorial/scripts/__init__.py 0 0 100% + tutorial/scripts/initialize_db.py 24 24 0% 1-34 + tutorial/views/__init__.py 0 0 100% + tutorial/views/default.py 12 0 100% + tutorial/views/notfound.py 4 4 0% 1-7 + ----------------------------------------------------------------- + TOTAL 88 37 58% + ===================== 2 passed in 0.57 seconds ====================== Our package doesn't quite have 100% test coverage. @@ -319,71 +457,6 @@ coverage. ``py.test -h`` to see its full set of options. -.. _initialize_db_wiki2: - -Initializing the database -------------------------- - -We need to use the ``initialize_tutorial_db`` :term:`console script` to -initialize our database. - -.. note:: - - The ``initialize_tutorial_db`` command does not perform a migration, but - rather it simply creates missing tables and adds some dummy data. If you - already have a database, you should delete it before running - ``initialize_tutorial_db`` again. - -Type the following command, making sure you are still in the ``tutorial`` -directory (the directory with a ``development.ini`` in it): - -On UNIX -^^^^^^^ - -.. code-block:: bash - - $ $VENV/bin/initialize_tutorial_db development.ini - -On Windows -^^^^^^^^^^ - -.. code-block:: doscon - - c:\tutorial> %VENV%\Scripts\initialize_tutorial_db development.ini - -The output to your console should be something like this: - -.. code-block:: bash - - 2016-12-18 21:30:08,675 INFO [sqlalchemy.engine.base.Engine:1235][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 - 2016-12-18 21:30:08,675 INFO [sqlalchemy.engine.base.Engine:1236][MainThread] () - 2016-12-18 21:30:08,676 INFO [sqlalchemy.engine.base.Engine:1235][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 - 2016-12-18 21:30:08,676 INFO [sqlalchemy.engine.base.Engine:1236][MainThread] () - 2016-12-18 21:30:08,676 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] PRAGMA table_info("models") - 2016-12-18 21:30:08,676 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] () - 2016-12-18 21:30:08,677 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] - CREATE TABLE models ( - id INTEGER NOT NULL, - name TEXT, - value INTEGER, - CONSTRAINT pk_models PRIMARY KEY (id) - ) - - - 2016-12-18 21:30:08,677 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] () - 2016-12-18 21:30:08,678 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT - 2016-12-18 21:30:08,679 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] CREATE UNIQUE INDEX my_index ON models (name) - 2016-12-18 21:30:08,679 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] () - 2016-12-18 21:30:08,679 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT - 2016-12-18 21:30:08,681 INFO [sqlalchemy.engine.base.Engine:679][MainThread] BEGIN (implicit) - 2016-12-18 21:30:08,682 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] INSERT INTO models (name, value) VALUES (?, ?) - 2016-12-18 21:30:08,682 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] ('one', 1) - 2016-12-18 21:30:08,682 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT - -Success! You should now have a ``tutorial.sqlite`` file in your current -working directory. This is an SQLite database with a single table defined in it -(``models``). - .. _wiki2-start-the-application: Start the application @@ -445,6 +518,10 @@ assumptions: - You are willing to use :term:`SQLAlchemy` for a database access tool. +- You are willing to use :term:`Alembic` for a database migrations tool. + +- You are willing to use a :term:`console script` for a data loading tool. + - You are willing to use :term:`URL dispatch` to map URLs to code. - You want to use zope.sqlalchemy_, pyramid_tm_, and the transaction_ packages -- cgit v1.2.3 From 9ce49866130be6b697e7b5ea5e0f1bb35d3ba7bc Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Tue, 26 Jun 2018 00:06:09 -0700 Subject: Add omitted files to basiclayout step --- .../wiki2/src/basiclayout/tutorial/alembic/env.py | 58 ++++++++++++++++++++++ .../basiclayout/tutorial/alembic/script.py.mako | 24 +++++++++ .../tutorial/alembic/versions/README.txt | 1 + .../basiclayout/tutorial/scripts/initialize_db.py | 44 ++++++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py create mode 100644 docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako create mode 100644 docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt create mode 100644 docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initialize_db.py (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py new file mode 100644 index 000000000..730785899 --- /dev/null +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py @@ -0,0 +1,58 @@ +"""Pyramid bootstrap environment. """ +from alembic import context +from pyramid.paster import get_appsettings, setup_logging + +from tutorial.models import get_engine +from tutorial.models.meta import Base + +config = context.config + +setup_logging(config.config_file_name) + +settings = get_appsettings(config.config_file_name) +target_metadata = Base.metadata + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + context.configure(url=settings['sqlalchemy.url']) + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + engine = get_engine(settings) + + connection = engine.connect() + context.configure( + connection=connection, + target_metadata=target_metadata + ) + + try: + with context.begin_transaction(): + context.run_migrations() + finally: + connection.close() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako new file mode 100644 index 000000000..2c0156303 --- /dev/null +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt new file mode 100644 index 000000000..09ed32c8d --- /dev/null +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/versions/README.txt @@ -0,0 +1 @@ +Placeholder for alembic versions \ No newline at end of file diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initialize_db.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initialize_db.py new file mode 100644 index 000000000..5b129e761 --- /dev/null +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initialize_db.py @@ -0,0 +1,44 @@ +import os +import sys + +from pyramid.paster import bootstrap, setup_logging +from sqlalchemy.exc import OperationalError + +from .. import models + + +def setup_models(dbsession): + model = models.MyModel(name='one', value=1) + dbsession.add(model) + + +def usage(argv): + cmd = os.path.basename(argv[0]) + print('usage: %s \n' + '(example: "%s development.ini")' % (cmd, cmd)) + sys.exit(1) + + +def main(argv=sys.argv): + if len(argv) != 2: + usage(argv) + config_uri = argv[1] + setup_logging(config_uri) + env = bootstrap(config_uri) + + try: + with env['request'].tm: + dbsession = env['request'].dbsession + setup_models(dbsession) + except OperationalError: + print(''' +Pyramid is having a problem using your SQL database. The problem +might be caused by one of the following things: + +1. You may need to initialize your database tables with `alembic`. + Check your README.txt for description and try to run it. + +2. Your database server may not be running. Check that the + database server referred to by the "sqlalchemy.url" setting in + your "development.ini" file is running. + ''') -- cgit v1.2.3 From 66086301a8d85444bb608e4158c15f25b5ae2cdc Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Tue, 26 Jun 2018 00:08:18 -0700 Subject: Add alembic, correct name of init script in setup.py - Adjust linenos in defining models step - Update package version numbers to latest --- docs/tutorials/wiki2/definingmodels.rst | 4 ++-- docs/tutorials/wiki2/src/models/setup.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/definingmodels.rst b/docs/tutorials/wiki2/definingmodels.rst index fd1967d99..d76959e30 100644 --- a/docs/tutorials/wiki2/definingmodels.rst +++ b/docs/tutorials/wiki2/definingmodels.rst @@ -33,7 +33,7 @@ Open ``tutorial/setup.py`` and edit it to look like the following: .. literalinclude:: src/models/setup.py :linenos: - :emphasize-lines: 12 + :emphasize-lines: 13 :language: python Only the highlighted line needs to be added. @@ -70,7 +70,7 @@ like the following. .. code-block:: text - Successfully installed bcrypt-3.1.2 cffi-1.9.1 pycparser-2.17 tutorial + Successfully installed bcrypt-3.1.4 cffi-1.11.5 pycparser-2.18 tutorial Remove ``mymodel.py`` diff --git a/docs/tutorials/wiki2/src/models/setup.py b/docs/tutorials/wiki2/src/models/setup.py index c688c6866..434487d15 100644 --- a/docs/tutorials/wiki2/src/models/setup.py +++ b/docs/tutorials/wiki2/src/models/setup.py @@ -9,6 +9,7 @@ with open(os.path.join(here, 'CHANGES.txt')) as f: CHANGES = f.read() requires = [ + 'alembic', 'bcrypt', 'plaster_pastedeploy', 'pyramid >= 1.9a', @@ -55,7 +56,7 @@ setup( 'main = tutorial:main', ], 'console_scripts': [ - 'initialize_tutorial_db = tutorial.scripts.initializedb:main', + 'initialize_tutorial_db = tutorial.scripts.initialize_db:main', ], }, ) -- cgit v1.2.3 From beeee29617d64f67f8eec2991f6b413351393c9e Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Tue, 26 Jun 2018 00:30:17 -0700 Subject: rename script to align with cookiecutter default --- docs/tutorials/wiki2/definingmodels.rst | 14 +++--- .../src/models/tutorial/scripts/initialize_db.py | 57 ++++++++++++++++++++++ .../src/models/tutorial/scripts/initializedb.py | 57 ---------------------- 3 files changed, 64 insertions(+), 64 deletions(-) create mode 100644 docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py delete mode 100644 docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/definingmodels.rst b/docs/tutorials/wiki2/definingmodels.rst index d76959e30..9ed84ce76 100644 --- a/docs/tutorials/wiki2/definingmodels.rst +++ b/docs/tutorials/wiki2/definingmodels.rst @@ -158,11 +158,11 @@ the following: Here we align our imports with the names of the models, ``Page`` and ``User``. -Edit ``scripts/initializedb.py`` -================================ +Edit ``scripts/initialize_db.py`` +================================= We haven't looked at the details of this file yet, but within the ``scripts`` -directory of your ``tutorial`` package is a file named ``initializedb.py``. +directory of your ``tutorial`` package is a file named ``initialize_db.py``. Code in this file is executed whenever we run the ``initialize_tutorial_db`` command, as we did in the installation step of this tutorial. @@ -171,15 +171,15 @@ command, as we did in the installation step of this tutorial. The command is named ``initialize_tutorial_db`` because of the mapping defined in the ``[console_scripts]`` entry point of our project's ``setup.py`` file. Since we've changed our model, we need to make changes to our -``initializedb.py`` script. In particular, we'll replace our import of +``initialize_db.py`` script. In particular, we'll replace our import of ``MyModel`` with those of ``User`` and ``Page``. We'll also change the very end of the script to create two ``User`` objects (``basic`` and ``editor``) as well as a ``Page``, rather than a ``MyModel``, and add them to our ``dbsession``. -Open ``tutorial/scripts/initializedb.py`` and edit it to look like the +Open ``tutorial/scripts/initialize_db.py`` and edit it to look like the following: -.. literalinclude:: src/models/tutorial/scripts/initializedb.py +.. literalinclude:: src/models/tutorial/scripts/initialize_db.py :linenos: :language: python :emphasize-lines: 18,44-57 @@ -192,7 +192,7 @@ Installing the project and re-initializing the database Because our model has changed, and in order to reinitialize the database, we need to rerun the ``initialize_tutorial_db`` command to pick up the changes -we've made to both the models.py file and to the initializedb.py file. See +we've made to both the models.py file and to the initialize_db.py file. See :ref:`initialize_db_wiki2` for instructions. Success will look something like this: diff --git a/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py b/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py new file mode 100644 index 000000000..f3c0a6fef --- /dev/null +++ b/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py @@ -0,0 +1,57 @@ +import os +import sys +import transaction + +from pyramid.paster import ( + get_appsettings, + setup_logging, + ) + +from pyramid.scripts.common import parse_vars + +from ..models.meta import Base +from ..models import ( + get_engine, + get_session_factory, + get_tm_session, + ) +from ..models import Page, User + + +def usage(argv): + cmd = os.path.basename(argv[0]) + print('usage: %s [var=value]\n' + '(example: "%s development.ini")' % (cmd, cmd)) + sys.exit(1) + + +def main(argv=sys.argv): + if len(argv) < 2: + usage(argv) + config_uri = argv[1] + options = parse_vars(argv[2:]) + setup_logging(config_uri) + settings = get_appsettings(config_uri, options=options) + + engine = get_engine(settings) + Base.metadata.create_all(engine) + + session_factory = get_session_factory(engine) + + with transaction.manager: + dbsession = get_tm_session(session_factory, transaction.manager) + + editor = User(name='editor', role='editor') + editor.set_password('editor') + dbsession.add(editor) + + basic = User(name='basic', role='basic') + basic.set_password('basic') + dbsession.add(basic) + + page = Page( + name='FrontPage', + creator=editor, + data='This is the front page', + ) + dbsession.add(page) diff --git a/docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py b/docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py deleted file mode 100644 index f3c0a6fef..000000000 --- a/docs/tutorials/wiki2/src/models/tutorial/scripts/initializedb.py +++ /dev/null @@ -1,57 +0,0 @@ -import os -import sys -import transaction - -from pyramid.paster import ( - get_appsettings, - setup_logging, - ) - -from pyramid.scripts.common import parse_vars - -from ..models.meta import Base -from ..models import ( - get_engine, - get_session_factory, - get_tm_session, - ) -from ..models import Page, User - - -def usage(argv): - cmd = os.path.basename(argv[0]) - print('usage: %s [var=value]\n' - '(example: "%s development.ini")' % (cmd, cmd)) - sys.exit(1) - - -def main(argv=sys.argv): - if len(argv) < 2: - usage(argv) - config_uri = argv[1] - options = parse_vars(argv[2:]) - setup_logging(config_uri) - settings = get_appsettings(config_uri, options=options) - - engine = get_engine(settings) - Base.metadata.create_all(engine) - - session_factory = get_session_factory(engine) - - with transaction.manager: - dbsession = get_tm_session(session_factory, transaction.manager) - - editor = User(name='editor', role='editor') - editor.set_password('editor') - dbsession.add(editor) - - basic = User(name='basic', role='basic') - basic.set_password('basic') - dbsession.add(basic) - - page = Page( - name='FrontPage', - creator=editor, - data='This is the front page', - ) - dbsession.add(page) -- cgit v1.2.3 From 9f349cdeb347d792a510f3d223a76897b1269f13 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Tue, 26 Jun 2018 10:02:50 -0700 Subject: drop alpha status from pyramid requirement in setup.py - See https://github.com/Pylons/pyramid-cookiecutter-alchemy/issues/34 --- docs/tutorials/wiki2/src/basiclayout/setup.py | 2 +- docs/tutorials/wiki2/src/installation/setup.py | 2 +- docs/tutorials/wiki2/src/models/setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/basiclayout/setup.py b/docs/tutorials/wiki2/src/basiclayout/setup.py index 1638ef28e..e0cc964fe 100644 --- a/docs/tutorials/wiki2/src/basiclayout/setup.py +++ b/docs/tutorials/wiki2/src/basiclayout/setup.py @@ -11,7 +11,7 @@ with open(os.path.join(here, 'CHANGES.txt')) as f: requires = [ 'alembic', 'plaster_pastedeploy', - 'pyramid >= 1.9a', + 'pyramid >= 1.9', 'pyramid_debugtoolbar', 'pyramid_jinja2', 'pyramid_retry', diff --git a/docs/tutorials/wiki2/src/installation/setup.py b/docs/tutorials/wiki2/src/installation/setup.py index 1638ef28e..e0cc964fe 100644 --- a/docs/tutorials/wiki2/src/installation/setup.py +++ b/docs/tutorials/wiki2/src/installation/setup.py @@ -11,7 +11,7 @@ with open(os.path.join(here, 'CHANGES.txt')) as f: requires = [ 'alembic', 'plaster_pastedeploy', - 'pyramid >= 1.9a', + 'pyramid >= 1.9', 'pyramid_debugtoolbar', 'pyramid_jinja2', 'pyramid_retry', diff --git a/docs/tutorials/wiki2/src/models/setup.py b/docs/tutorials/wiki2/src/models/setup.py index 434487d15..2576cc848 100644 --- a/docs/tutorials/wiki2/src/models/setup.py +++ b/docs/tutorials/wiki2/src/models/setup.py @@ -12,7 +12,7 @@ requires = [ 'alembic', 'bcrypt', 'plaster_pastedeploy', - 'pyramid >= 1.9a', + 'pyramid >= 1.9', 'pyramid_debugtoolbar', 'pyramid_jinja2', 'pyramid_retry', -- cgit v1.2.3 From 5b3f50e56b2e4a64be29a54ca8d27a9836dec6a9 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Wed, 27 Jun 2018 16:26:55 -0700 Subject: switch to engine_from_config to be consistent with run_migrations_offline See https://github.com/Pylons/pyramid-cookiecutter-alchemy/commit/f1ab68543d3e44fc1a5df0aa0355f08578f38b7a --- docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py | 4 ++-- docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py index 730785899..ba116d0f3 100644 --- a/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/alembic/env.py @@ -1,8 +1,8 @@ """Pyramid bootstrap environment. """ from alembic import context from pyramid.paster import get_appsettings, setup_logging +from sqlalchemy import engine_from_config -from tutorial.models import get_engine from tutorial.models.meta import Base config = context.config @@ -37,7 +37,7 @@ def run_migrations_online(): and associate a connection with the context. """ - engine = get_engine(settings) + engine = engine_from_config(settings, prefix='sqlalchemy.') connection = engine.connect() context.configure( diff --git a/docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py b/docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py index 730785899..ba116d0f3 100644 --- a/docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py +++ b/docs/tutorials/wiki2/src/installation/tutorial/alembic/env.py @@ -1,8 +1,8 @@ """Pyramid bootstrap environment. """ from alembic import context from pyramid.paster import get_appsettings, setup_logging +from sqlalchemy import engine_from_config -from tutorial.models import get_engine from tutorial.models.meta import Base config = context.config @@ -37,7 +37,7 @@ def run_migrations_online(): and associate a connection with the context. """ - engine = get_engine(settings) + engine = engine_from_config(settings, prefix='sqlalchemy.') connection = engine.connect() context.configure( -- cgit v1.2.3 From 89e464b28c0aa87f452474ec0c9feacfd0ec47f3 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Wed, 27 Jun 2018 16:27:22 -0700 Subject: Add alembic directory to source in models step --- .../wiki2/src/models/tutorial/alembic/env.py | 58 ++++++++++++++++++++++ .../src/models/tutorial/alembic/script.py.mako | 24 +++++++++ .../models/tutorial/alembic/versions/README.txt | 1 + 3 files changed, 83 insertions(+) create mode 100644 docs/tutorials/wiki2/src/models/tutorial/alembic/env.py create mode 100644 docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako create mode 100644 docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/models/tutorial/alembic/env.py b/docs/tutorials/wiki2/src/models/tutorial/alembic/env.py new file mode 100644 index 000000000..ba116d0f3 --- /dev/null +++ b/docs/tutorials/wiki2/src/models/tutorial/alembic/env.py @@ -0,0 +1,58 @@ +"""Pyramid bootstrap environment. """ +from alembic import context +from pyramid.paster import get_appsettings, setup_logging +from sqlalchemy import engine_from_config + +from tutorial.models.meta import Base + +config = context.config + +setup_logging(config.config_file_name) + +settings = get_appsettings(config.config_file_name) +target_metadata = Base.metadata + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + context.configure(url=settings['sqlalchemy.url']) + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + engine = engine_from_config(settings, prefix='sqlalchemy.') + + connection = engine.connect() + context.configure( + connection=connection, + target_metadata=target_metadata + ) + + try: + with context.begin_transaction(): + context.run_migrations() + finally: + connection.close() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako b/docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako new file mode 100644 index 000000000..2c0156303 --- /dev/null +++ b/docs/tutorials/wiki2/src/models/tutorial/alembic/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt b/docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt new file mode 100644 index 000000000..09ed32c8d --- /dev/null +++ b/docs/tutorials/wiki2/src/models/tutorial/alembic/versions/README.txt @@ -0,0 +1 @@ +Placeholder for alembic versions \ No newline at end of file -- cgit v1.2.3 From 03fc543e74029978dc38eb0765f24bfe40adbc50 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Thu, 28 Jun 2018 01:22:35 -0700 Subject: Add Alembic step and overview --- docs/tutorials/wiki2/definingmodels.rst | 129 ++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/definingmodels.rst b/docs/tutorials/wiki2/definingmodels.rst index 9ed84ce76..0fed0585c 100644 --- a/docs/tutorials/wiki2/definingmodels.rst +++ b/docs/tutorials/wiki2/definingmodels.rst @@ -158,6 +158,135 @@ the following: Here we align our imports with the names of the models, ``Page`` and ``User``. +.. _wiki2_migrate_database_alembic: + +Migrate the database with Alembic +================================= + +Now that we have written our models, we need to modify the database schema to reflect the changes to our code. Let's generate a new revision, then upgrade the database to the latest revision (head). + +On UNIX: + +.. code-block:: bash + + $ $VENV/bin/alembic -c development.ini revision --autogenerate \ + -m "use new models Page and User" + $ $VENV/bin/alembic -c development.ini upgrade head + +On Windows: + +.. code-block:: doscon + + c:\tutorial> %VENV%\Scripts\alembic -c development.ini revision \ + --autogenerate -m "use new models Page and User" + c:\tutorial> %VENV%\Scripts\alembic -c development.ini upgrade head + +Success executing these commands will generate output similar to the following. + +.. code-block:: text + + 2018-06-28 00:43:15,609 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 + 2018-06-28 00:43:15,609 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-28 00:43:15,610 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 + 2018-06-28 00:43:15,610 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-28 00:43:15,612 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version") + 2018-06-28 00:43:15,612 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,613 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT alembic_version.version_num + FROM alembic_version + 2018-06-28 00:43:15,613 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,620 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT name FROM sqlite_master WHERE type='table' ORDER BY name + 2018-06-28 00:43:15,620 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,622 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("models") + 2018-06-28 00:43:15,622 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,623 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = 'models' AND type = 'table' + 2018-06-28 00:43:15,623 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,624 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA foreign_key_list("models") + 2018-06-28 00:43:15,624 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,624 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = 'models' AND type = 'table' + 2018-06-28 00:43:15,624 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,625 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA index_list("models") + 2018-06-28 00:43:15,625 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,625 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA index_info("my_index") + 2018-06-28 00:43:15,626 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,626 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA index_list("models") + 2018-06-28 00:43:15,626 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,626 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA index_info("my_index") + 2018-06-28 00:43:15,626 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:43:15,626 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = 'models' AND type = 'table' + 2018-06-28 00:43:15,627 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + Generating //tutorial/tutorial/alembic/versions/20180628_9451789ab7d6.py ... done + +.. code-block:: text + + 2018-06-28 00:46:18,152 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 + 2018-06-28 00:46:18,153 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-28 00:46:18,153 INFO [sqlalchemy.engine.base.Engine:1254][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 + 2018-06-28 00:46:18,153 INFO [sqlalchemy.engine.base.Engine:1255][MainThread] () + 2018-06-28 00:46:18,155 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] PRAGMA table_info("alembic_version") + 2018-06-28 00:46:18,155 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:46:18,155 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] SELECT alembic_version.version_num + FROM alembic_version + 2018-06-28 00:46:18,155 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:46:18,159 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] + CREATE TABLE users ( + id INTEGER NOT NULL, + name TEXT NOT NULL, + role TEXT NOT NULL, + password_hash TEXT, + CONSTRAINT pk_users PRIMARY KEY (id), + CONSTRAINT uq_users_name UNIQUE (name) + ) + + + 2018-06-28 00:46:18,159 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:46:18,160 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + 2018-06-28 00:46:18,161 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] + CREATE TABLE pages ( + id INTEGER NOT NULL, + name TEXT NOT NULL, + data TEXT NOT NULL, + creator_id INTEGER NOT NULL, + CONSTRAINT pk_pages PRIMARY KEY (id), + CONSTRAINT fk_pages_creator_id_users FOREIGN KEY(creator_id) REFERENCES users (id), + CONSTRAINT uq_pages_name UNIQUE (name) + ) + + + 2018-06-28 00:46:18,161 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:46:18,162 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + 2018-06-28 00:46:18,163 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] + DROP INDEX my_index + 2018-06-28 00:46:18,163 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:46:18,164 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + 2018-06-28 00:46:18,164 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] + DROP TABLE models + 2018-06-28 00:46:18,164 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:46:18,165 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + 2018-06-28 00:46:18,166 INFO [sqlalchemy.engine.base.Engine:1151][MainThread] UPDATE alembic_version SET version_num='9451789ab7d6' WHERE alembic_version.version_num = 'd2f465a83563' + 2018-06-28 00:46:18,166 INFO [sqlalchemy.engine.base.Engine:1154][MainThread] () + 2018-06-28 00:46:18,166 INFO [sqlalchemy.engine.base.Engine:722][MainThread] COMMIT + + +.. _wiki2_alembic_overview: + +Alembic overview +---------------- + +Let's briefly discuss our configuration for Alembic. + +In the alchemy cookiecutter's ``development.ini`` file, the setting for ``script_location`` configures Alembic to look for the migration script in the directory ``tutorial/alembic``. +By default Alembic stores the migration files one level deeper in ``tutorial/alembic/versions``. +These files are generated by Alembic, then executed when we run upgrade or downgrade migrations. +The setting ``file_template`` provides the format for each migration's file name. +We've configured the ``file_template`` setting to make it somewhat easy to find migrations by file name. + +At this point in this tutorial, we have two migration files. +Examine them to see what Alembic will do when you upgrade or downgrade the database to a specific revision. +Notice the revision identifiers and how they relate to one another in a chained sequence. + +.. seealso:: For further information, see the `Alembic documentation `_. + + Edit ``scripts/initialize_db.py`` ================================= -- cgit v1.2.3 From 0fa7506987e2a8d1fa68ab307ef325de5fb137ec Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Thu, 28 Jun 2018 01:46:42 -0700 Subject: First stab at updated db script --- .../src/models/tutorial/scripts/initialize_db.py | 77 +++++++++++----------- 1 file changed, 38 insertions(+), 39 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py b/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py index f3c0a6fef..af4c625ae 100644 --- a/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py +++ b/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py @@ -1,57 +1,56 @@ import os import sys -import transaction -from pyramid.paster import ( - get_appsettings, - setup_logging, - ) +from pyramid.paster import bootstrap, setup_logging +from sqlalchemy.exc import OperationalError + +from ..models import Page, User -from pyramid.scripts.common import parse_vars -from ..models.meta import Base -from ..models import ( - get_engine, - get_session_factory, - get_tm_session, +def setup_models(dbsession): + editor = User(name='editor', role='editor') + editor.set_password('editor') + dbsession.add(editor) + + basic = User(name='basic', role='basic') + basic.set_password('basic') + dbsession.add(basic) + + page = Page( + name='FrontPage', + creator=editor, + data='This is the front page', ) -from ..models import Page, User + dbsession.add(page) def usage(argv): cmd = os.path.basename(argv[0]) - print('usage: %s [var=value]\n' + print('usage: %s \n' '(example: "%s development.ini")' % (cmd, cmd)) sys.exit(1) def main(argv=sys.argv): - if len(argv) < 2: + if len(argv) != 2: usage(argv) config_uri = argv[1] - options = parse_vars(argv[2:]) setup_logging(config_uri) - settings = get_appsettings(config_uri, options=options) - - engine = get_engine(settings) - Base.metadata.create_all(engine) - - session_factory = get_session_factory(engine) - - with transaction.manager: - dbsession = get_tm_session(session_factory, transaction.manager) - - editor = User(name='editor', role='editor') - editor.set_password('editor') - dbsession.add(editor) - - basic = User(name='basic', role='basic') - basic.set_password('basic') - dbsession.add(basic) - - page = Page( - name='FrontPage', - creator=editor, - data='This is the front page', - ) - dbsession.add(page) + env = bootstrap(config_uri) + + try: + with env['request'].tm: + dbsession = env['request'].dbsession + setup_models(dbsession) + except OperationalError: + print(''' +Pyramid is having a problem using your SQL database. The problem +might be caused by one of the following things: + +1. You may need to initialize your database tables with `alembic`. + Check your README.txt for description and try to run it. + +2. Your database server may not be running. Check that the + database server referred to by the "sqlalchemy.url" setting in + your "development.ini" file is running. + ''') -- cgit v1.2.3 From 6986c6b7a4c525144b4719a355cb6fd0053cff03 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Thu, 28 Jun 2018 01:49:21 -0700 Subject: Modify sections for db script to align with Alembic workflow (WIP) - This is not complete. I don't know what I did wrong, but the script does not run. --- docs/tutorials/wiki2/definingmodels.rst | 58 ++++----------------------------- 1 file changed, 7 insertions(+), 51 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/definingmodels.rst b/docs/tutorials/wiki2/definingmodels.rst index 0fed0585c..6fb4c0c1b 100644 --- a/docs/tutorials/wiki2/definingmodels.rst +++ b/docs/tutorials/wiki2/definingmodels.rst @@ -301,8 +301,7 @@ command, as we did in the installation step of this tutorial. Since we've changed our model, we need to make changes to our ``initialize_db.py`` script. In particular, we'll replace our import of -``MyModel`` with those of ``User`` and ``Page``. We'll also change the very end -of the script to create two ``User`` objects (``basic`` and ``editor``) as well +``MyModel`` with those of ``User`` and ``Page``. We'll also change the the script to create two ``User`` objects (``basic`` and ``editor``) as well as a ``Page``, rather than a ``MyModel``, and add them to our ``dbsession``. Open ``tutorial/scripts/initialize_db.py`` and edit it to look like the @@ -316,61 +315,18 @@ following: Only the highlighted lines need to be changed. -Installing the project and re-initializing the database -======================================================= +Populating the database +======================= -Because our model has changed, and in order to reinitialize the database, we +Because our model has changed, and to repopulate the database, we need to rerun the ``initialize_tutorial_db`` command to pick up the changes -we've made to both the models.py file and to the initialize_db.py file. See -:ref:`initialize_db_wiki2` for instructions. +we've made to the initialize_db.py file. See :ref:`initialize_db_wiki2` for instructions. Success will look something like this: -.. code-block:: bash - - 2016-12-20 02:51:11,195 INFO [sqlalchemy.engine.base.Engine:1235][MainThread] SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1 - 2016-12-20 02:51:11,195 INFO [sqlalchemy.engine.base.Engine:1236][MainThread] () - 2016-12-20 02:51:11,195 INFO [sqlalchemy.engine.base.Engine:1235][MainThread] SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1 - 2016-12-20 02:51:11,195 INFO [sqlalchemy.engine.base.Engine:1236][MainThread] () - 2016-12-20 02:51:11,196 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] PRAGMA table_info("pages") - 2016-12-20 02:51:11,196 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] () - 2016-12-20 02:51:11,196 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] PRAGMA table_info("users") - 2016-12-20 02:51:11,197 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] () - 2016-12-20 02:51:11,197 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] - CREATE TABLE users ( - id INTEGER NOT NULL, - name TEXT NOT NULL, - role TEXT NOT NULL, - password_hash TEXT, - CONSTRAINT pk_users PRIMARY KEY (id), - CONSTRAINT uq_users_name UNIQUE (name) - ) - - - 2016-12-20 02:51:11,197 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] () - 2016-12-20 02:51:11,198 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT - 2016-12-20 02:51:11,199 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] - CREATE TABLE pages ( - id INTEGER NOT NULL, - name TEXT NOT NULL, - data TEXT NOT NULL, - creator_id INTEGER NOT NULL, - CONSTRAINT pk_pages PRIMARY KEY (id), - CONSTRAINT uq_pages_name UNIQUE (name), - CONSTRAINT fk_pages_creator_id_users FOREIGN KEY(creator_id) REFERENCES users (id) - ) - +.. code-block:: text - 2016-12-20 02:51:11,199 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] () - 2016-12-20 02:51:11,200 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT - 2016-12-20 02:51:11,755 INFO [sqlalchemy.engine.base.Engine:679][MainThread] BEGIN (implicit) - 2016-12-20 02:51:11,755 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] INSERT INTO users (name, role, password_hash) VALUES (?, ?, ?) - 2016-12-20 02:51:11,755 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] ('editor', 'editor', '$2b$12$ds7h2Zb7.l6TEFup5h8f4ekA9GRfEpE1yQGDRvT9PConw73kKuupG') - 2016-12-20 02:51:11,756 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] INSERT INTO users (name, role, password_hash) VALUES (?, ?, ?) - 2016-12-20 02:51:11,756 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] ('basic', 'basic', '$2b$12$KgruXP5Vv7rikr6dGB3TF.flGXYpiE0Li9K583EVomjY.SYmQOsyi') - 2016-12-20 02:51:11,757 INFO [sqlalchemy.engine.base.Engine:1140][MainThread] INSERT INTO pages (name, data, creator_id) VALUES (?, ?, ?) - 2016-12-20 02:51:11,757 INFO [sqlalchemy.engine.base.Engine:1143][MainThread] ('FrontPage', 'This is the front page', 1) - 2016-12-20 02:51:11,757 INFO [sqlalchemy.engine.base.Engine:719][MainThread] COMMIT + Output goes here, once I figure out how to get the script to run. View the application in a browser -- cgit v1.2.3 From 80ab8e738e7c997d8931df83c5714e5959e7b4ba Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Thu, 28 Jun 2018 16:23:25 -0700 Subject: Change import to module scope --- docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py b/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py index af4c625ae..231d5d44b 100644 --- a/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py +++ b/docs/tutorials/wiki2/src/models/tutorial/scripts/initialize_db.py @@ -4,19 +4,19 @@ import sys from pyramid.paster import bootstrap, setup_logging from sqlalchemy.exc import OperationalError -from ..models import Page, User +from .. import models def setup_models(dbsession): - editor = User(name='editor', role='editor') + editor = models.User(name='editor', role='editor') editor.set_password('editor') dbsession.add(editor) - basic = User(name='basic', role='basic') + basic = models.User(name='basic', role='basic') basic.set_password('basic') dbsession.add(basic) - page = Page( + page = models.Page( name='FrontPage', creator=editor, data='This is the front page', -- cgit v1.2.3 From c71eeae50ed148407c530de783f808cece8537e1 Mon Sep 17 00:00:00 2001 From: Steve Piercy Date: Fri, 29 Jun 2018 00:25:15 -0700 Subject: Resynch src files to cookiecutter --- .../wiki2/src/basiclayout/tutorial/scripts/initialize_db.py | 2 +- .../wiki2/src/basiclayout/tutorial/templates/layout.jinja2 | 2 +- .../src/basiclayout/tutorial/templates/mytemplate.jinja2 | 2 +- .../wiki2/src/basiclayout/tutorial/views/default.py | 6 +++--- .../wiki2/src/installation/tutorial/scripts/initialize_db.py | 2 +- .../wiki2/src/installation/tutorial/templates/layout.jinja2 | 2 +- docs/tutorials/wiki2/src/models/README.txt | 12 +++++++++++- docs/tutorials/wiki2/src/models/development.ini | 6 ++++++ docs/tutorials/wiki2/src/models/production.ini | 6 ++++++ docs/tutorials/wiki2/src/models/pytest.ini | 2 +- .../wiki2/src/models/tutorial/templates/layout.jinja2 | 2 +- docs/tutorials/wiki2/src/models/tutorial/views/default.py | 11 +++++------ 12 files changed, 38 insertions(+), 17 deletions(-) (limited to 'docs/tutorials') diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initialize_db.py b/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initialize_db.py index 5b129e761..b882f9bf7 100644 --- a/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initialize_db.py +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/scripts/initialize_db.py @@ -8,7 +8,7 @@ from .. import models def setup_models(dbsession): - model = models.MyModel(name='one', value=1) + model = models.mymodel.MyModel(name='one', value=1) dbsession.add(model) diff --git a/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja2 b/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja2 index 6ce99d08e..5d4313fe2 100644 --- a/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja2 +++ b/docs/tutorials/wiki2/src/basiclayout/tutorial/templates/layout.jinja2 @@ -16,7 +16,7 @@ - + - + - + - + - + - + - +