| | |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ sudo apt-get install libsqlite3-dev |
| | | sudo apt-get install libsqlite3-dev |
| | | |
| | | |
| | | Install cookiecutter |
| | |
| | | Generate a Pyramid project from a cookiecutter |
| | | ---------------------------------------------- |
| | | |
| | | We will create a Pyramid project in your home directory for UNIX or at the root for Windows. It is assumed you know the path to where you installed ``cookiecutter``. Issue the following commands and override the defaults in the prompts as follows. |
| | | We will create a Pyramid project in your home directory for Unix or at the root for Windows. It is assumed you know the path to where you installed ``cookiecutter``. Issue the following commands and override the defaults in the prompts as follows. |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ cd ~ |
| | | $ cookiecutter https://github.com/Pylons/pyramid-cookiecutter-alchemy |
| | | cd ~ |
| | | cookiecutter gh:Pylons/pyramid-cookiecutter-starter --checkout 1.10-branch |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\> cd \ |
| | | c:\> cookiecutter https://github.com/Pylons/pyramid-cookiecutter-alchemy |
| | | cd \ |
| | | cookiecutter gh:Pylons/pyramid-cookiecutter-starter --checkout 1.10-branch |
| | | |
| | | On all operating systems |
| | | ^^^^^^^^^^^^^^^^^^^^^^^^ |
| | | If prompted for the first item, accept the default ``yes`` by hitting return. |
| | | |
| | | #. ``You've cloned ~/.cookiecutters/pyramid-cookiecutter-alchemy before. Is it |
| | | okay to delete and re-clone it? [yes]:`` |
| | | #. ``project_name [Pyramid Scaffold]: myproj`` |
| | | #. ``repo_name [scaffold]: tutorial`` |
| | | .. code-block:: text |
| | | |
| | | You've cloned ~/.cookiecutters/pyramid-cookiecutter-starter before. |
| | | Is it okay to delete and re-clone it? [yes]: yes |
| | | project_name [Pyramid Scaffold]: myproj |
| | | repo_name [myproj]: tutorial |
| | | Select template_language: |
| | | 1 - jinja2 |
| | | 2 - chameleon |
| | | 3 - mako |
| | | Choose from 1, 2, 3 [1]: 1 |
| | | Select backend: |
| | | 1 - none |
| | | 2 - sqlalchemy |
| | | 3 - zodb |
| | | Choose from 1, 2, 3 [1]: 2 |
| | | |
| | | |
| | | Change directory into your newly created project |
| | | ------------------------------------------------ |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ cd tutorial |
| | | cd tutorial |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\> cd tutorial |
| | | cd tutorial |
| | | |
| | | |
| | | Set and use a ``VENV`` environment variable |
| | |
| | | |
| | | We will set the ``VENV`` environment variable to the absolute path of the virtual environment, and use it going forward. |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ export VENV=~/tutorial |
| | | export VENV=~/tutorial |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> set VENV=c:\tutorial |
| | | set VENV=c:\tutorial |
| | | |
| | | |
| | | Create a virtual environment |
| | | ---------------------------- |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ python3 -m venv $VENV |
| | | python3 -m venv $VENV |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | Each version of Python uses different paths, so you will need to adjust the path to the command for your Python version. |
| | | Each version of Python uses different paths, so you will need to adjust the path to the command for your Python version. Recent versions of the Python 3 installer for Windows now install a Python launcher. |
| | | |
| | | Python 2.7: |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> c:\Python27\Scripts\virtualenv %VENV% |
| | | c:\Python27\Scripts\virtualenv %VENV% |
| | | |
| | | Python 3.6: |
| | | Python 3.7: |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> c:\Python36\Scripts\python -m venv %VENV% |
| | | python -m venv %VENV% |
| | | |
| | | |
| | | Upgrade packaging tools in the virtual environment |
| | | -------------------------------------------------- |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ $VENV/bin/pip install --upgrade pip setuptools |
| | | $VENV/bin/pip install --upgrade pip setuptools |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> %VENV%\Scripts\pip install --upgrade pip setuptools |
| | | %VENV%\Scripts\pip install --upgrade pip setuptools |
| | | |
| | | |
| | | .. _installing_project_in_dev_mode: |
| | |
| | | |
| | | In order to do development on the project easily, you must "register" the project as a development egg in your workspace. We will install testing requirements at the same time. We do so with the following command. |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ $VENV/bin/pip install -e ".[testing]" |
| | | $VENV/bin/pip install -e ".[testing]" |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> %VENV%\Scripts\pip install -e ".[testing]" |
| | | %VENV%\Scripts\pip install -e ".[testing]" |
| | | |
| | | On all operating systems |
| | | ^^^^^^^^^^^^^^^^^^^^^^^^ |
| | |
| | | Testing requirements are defined in our project's ``setup.py`` file, in the ``tests_require`` and ``extras_require`` stanzas. |
| | | |
| | | .. literalinclude:: src/installation/setup.py |
| | | :language: python |
| | | :lineno-match: |
| | | :lines: 22-26 |
| | | :language: python |
| | | :lineno-match: |
| | | :lines: 24-28 |
| | | |
| | | .. literalinclude:: src/installation/setup.py |
| | | :language: python |
| | | :lineno-match: |
| | | :lines: 46-48 |
| | | :language: python |
| | | :lineno-match: |
| | | :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 |
| | | |
| | | %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 /<somepath>/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 |
| | | |
| | | %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 |
| | | |
| | | %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: |
| | |
| | | |
| | | After you've installed the project in development mode as well as the testing |
| | | requirements, you may run the tests for the project. The following commands |
| | | provide options to py.test that specify the module for which its tests shall be |
| | | run, and to run py.test in quiet mode. |
| | | provide options to ``pytest`` that specify the module for which its tests shall be |
| | | run, and to run ``pytest`` in quiet mode. |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ $VENV/bin/py.test -q |
| | | $VENV/bin/pytest -q |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> %VENV%\Scripts\py.test -q |
| | | %VENV%\Scripts\pytest -q |
| | | |
| | | For a successful test run, you should see output that ends like this: |
| | | |
| | | .. code-block:: bash |
| | | |
| | | .. |
| | | 2 passed in 0.44 seconds |
| | | .. |
| | | 2 passed in 0.44 seconds |
| | | |
| | | |
| | | Expose test coverage information |
| | | -------------------------------- |
| | | |
| | | You can run the ``py.test`` command to see test coverage information. This |
| | | runs the tests in the same way that ``py.test`` does, but provides additional |
| | | You can run the ``pytest`` command to see test coverage information. This |
| | | runs the tests in the same way that ``pytest`` does, but provides additional |
| | | :term:`coverage` information, exposing which lines of your project are covered by the |
| | | tests. |
| | | |
| | | We've already installed the ``pytest-cov`` package into our virtual |
| | | environment, so we can run the tests with coverage. |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ $VENV/bin/py.test --cov --cov-report=term-missing |
| | | $VENV/bin/pytest --cov --cov-report=term-missing |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> %VENV%\Scripts\py.test --cov --cov-report=term-missing |
| | | c:\tutorial> %VENV%\Scripts\pytest --cov --cov-report=term-missing |
| | | |
| | | 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: /<somepath>/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. |
| | |
| | | Test and coverage cookiecutter defaults |
| | | --------------------------------------- |
| | | |
| | | Cookiecutters include configuration defaults for ``py.test`` and test coverage. |
| | | Cookiecutters include configuration defaults for ``pytest`` and test coverage. |
| | | These configuration files are ``pytest.ini`` and ``.coveragerc``, located at |
| | | the root of your package. Without these defaults, we would need to specify the |
| | | path to the module on which we want to run tests and coverage. |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ $VENV/bin/py.test --cov=tutorial tutorial/tests.py -q |
| | | $VENV/bin/pytest --cov=tutorial tutorial/tests.py -q |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> %VENV%\Scripts\py.test --cov=tutorial tutorial\tests.py -q |
| | | %VENV%\Scripts\pytest --cov=tutorial tutorial\tests.py -q |
| | | |
| | | py.test follows :ref:`conventions for Python test discovery |
| | | pytest follows :ref:`conventions for Python test discovery |
| | | <pytest:test discovery>`, and the configuration defaults from the cookiecutter |
| | | tell ``py.test`` where to find the module on which we want to run tests and |
| | | tell ``pytest`` where to find the module on which we want to run tests and |
| | | coverage. |
| | | |
| | | .. seealso:: See py.test's documentation for :ref:`pytest:usage` or invoke |
| | | ``py.test -h`` to see its full set of options. |
| | | .. seealso:: See ``pytest``'s documentation for :ref:`pytest:usage` or invoke |
| | | ``pytest -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. See :ref:`what_is_this_pserve_thing` for more |
| | | information on ``pserve``. |
| | | |
| | | On UNIX |
| | | On Unix |
| | | ^^^^^^^ |
| | | |
| | | .. code-block:: bash |
| | | |
| | | $ $VENV/bin/pserve development.ini --reload |
| | | $VENV/bin/pserve development.ini --reload |
| | | |
| | | On Windows |
| | | ^^^^^^^^^^ |
| | | |
| | | .. code-block:: doscon |
| | | |
| | | c:\tutorial> %VENV%\Scripts\pserve development.ini --reload |
| | | %VENV%\Scripts\pserve development.ini --reload |
| | | |
| | | .. note:: |
| | | |
| | |
| | | application while you develop. |
| | | |
| | | |
| | | Decisions the ``alchemy`` cookiecutter has made for you |
| | | ------------------------------------------------------- |
| | | Decisions the cookiecutter backend option ``sqlalchemy`` has made for you |
| | | ------------------------------------------------------------------------- |
| | | |
| | | Creating a project using the ``alchemy`` cookiecutter makes the following |
| | | assumptions: |
| | | When creating a project and selecting the backend option of ``sqlalchemy``, the |
| | | cookiecutter makes the following assumptions: |
| | | |
| | | - You are willing to use SQLite for persistent storage, although almost any SQL database could be used with SQLAlchemy. |
| | | |
| | | - 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 |
| | | to scope sessions to requests. |
| | | |
| | | - You want to use pyramid_jinja2_ to render your templates. Different |
| | | templating engines can be used, but we had to choose one to make this |
| | | tutorial. See :ref:`available_template_system_bindings` for some options. |
| | | |
| | | .. note:: |
| | | |
| | |
| | | tutorial, we'll only be using :term:`URL dispatch` and :term:`SQLAlchemy`. |
| | | |
| | | .. _pyramid_jinja2: |
| | | http://docs.pylonsproject.org/projects/pyramid-jinja2/en/latest/ |
| | | https://docs.pylonsproject.org/projects/pyramid-jinja2/en/latest/ |
| | | |
| | | .. _pyramid_tm: |
| | | http://docs.pylonsproject.org/projects/pyramid-tm/en/latest/ |
| | | https://docs.pylonsproject.org/projects/pyramid-tm/en/latest/ |
| | | |
| | | .. _zope.sqlalchemy: |
| | | https://pypi.python.org/pypi/zope.sqlalchemy |
| | | https://pypi.org/project/zope.sqlalchemy/ |
| | | |
| | | .. _transaction: |
| | | http://zodb.readthedocs.org/en/latest/transactions.html |
| | | https://zodb.readthedocs.io/en/latest/transactions.html |