| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | App Database
 | 
					
						
							|  |  |  | ============
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  | The :term:`app database` is used at minimum to store the
 | 
					
						
							|  |  |  | :term:`settings table`, but usually also has tables for other
 | 
					
						
							|  |  |  | :term:`data models <data model>` used by the app.
 | 
					
						
							| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  | If you *only* want a settings table but do not need the app database
 | 
					
						
							|  |  |  | to serve any other purpose, see :doc:`/narr/config/table`.
 | 
					
						
							| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  | .. _create-appdb:
 | 
					
						
							| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  | Create the Database
 | 
					
						
							|  |  |  | -------------------
 | 
					
						
							| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  | There is not currently any tooling in WuttJamaican to *create* the
 | 
					
						
							|  |  |  | database (unless using a SQLite file, which may happen automatically).
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PostgreSQL is the recommended backend for production, as it is the
 | 
					
						
							|  |  |  | only one with rigorous usage thus far.  MySQL should also work though
 | 
					
						
							|  |  |  | and you're free to experiment.  Theoretically anything supported by
 | 
					
						
							|  |  |  | SQLAlchemy should work; see :doc:`sqlalchemy:dialects/index`.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | You may need to install additional Python and/or OS packages to
 | 
					
						
							|  |  |  | support your desired backend.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PostgreSQL
 | 
					
						
							|  |  |  | ~~~~~~~~~~
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Install APT packages if needed:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo apt install postgresql libpq-dev
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Install Python packages (to :term:`virtual environment`) if needed:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    pip install psycopg2
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Make a new DB user ("myuser") if needed:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo -u postgres createuser myuser
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And if so, also set the password:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo -u postgres psql -c "ALTER USER myuser PASSWORD 'mypassword'"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And finally create the DB ("myappdb" owned by "myuser"):
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo -u postgres createdb -O myuser myappdb
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MySQL
 | 
					
						
							|  |  |  | ~~~~~
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Install APT packages if needed:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo apt install default-mysql-server
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Install Python packages (to :term:`virtual environment`) if needed:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    pip install mysql-connector-python
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Make a new DB user ("myuser") if needed:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo mysql -e "CREATE USER myuser@localhost"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And if so, also set the password:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo mysql -e "ALTER USER myuser@localhost  IDENTIFIED BY 'mypassword'"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Create the DB ("myappdb"):
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo mysqladmin create myappdb
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And grant all perms (to "myuser" for "myappdb"):
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    sudo mysql -e "GRANT ALL ON myappdb.* TO myuser@localhost"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Configure the Connection
 | 
					
						
							|  |  |  | ------------------------
 | 
					
						
							| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | Once you have a database ready, add to your :term:`config file` the
 | 
					
						
							|  |  |  | details, for example:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: ini
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    [wutta.db]
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |    # postgres
 | 
					
						
							|  |  |  |    default.url = postgresql://myuser:mypassword@localhost/myappdb
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    # mysql
 | 
					
						
							|  |  |  |    default.url = mysql+mysqlconnector://myuser:mypassword@localhost/myappdb
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | You also most likely want to prefer settings from the DB over those
 | 
					
						
							|  |  |  | found in the config file(s).  See also
 | 
					
						
							|  |  |  | :ref:`where-config-settings-come-from` but the gist is, you should add
 | 
					
						
							|  |  |  | this config:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: ini
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    [wutta.config]
 | 
					
						
							|  |  |  |    usedb = true
 | 
					
						
							|  |  |  |    preferdb = true
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Install the Schema
 | 
					
						
							|  |  |  | ------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | So far there is not a tool to "create all tables" for the :term:`app
 | 
					
						
							|  |  |  | model` in one step per se.  Rather, we use Alembic to "apply all
 | 
					
						
							|  |  |  | migrations" to get to the latest schema.  (The end result is the
 | 
					
						
							|  |  |  | same.)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | See also the :doc:`Alembic docs <alembic:index>`, but our process is
 | 
					
						
							|  |  |  | fairly simple.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | First add some Alembic settings to your :term:`config file`:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: ini
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    [alembic]
 | 
					
						
							|  |  |  |    script_location = wuttjamaican.db:alembic
 | 
					
						
							|  |  |  |    version_locations = wuttjamaican.db:alembic/versions
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Usually the ``script_location`` shown above will work fine, but the
 | 
					
						
							|  |  |  | ``version_locations`` may vary depending on which packages contribute
 | 
					
						
							|  |  |  | to your overall app model.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For instance a Poser app which also uses :doc:`Wutta-Continuum
 | 
					
						
							|  |  |  | <wutta-continuum:index>` may specify this instead:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: ini
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    [alembic]
 | 
					
						
							|  |  |  |    script_location = wuttjamaican.db:alembic
 | 
					
						
							|  |  |  |    version_locations = wutta_continuum.db:alembic/versions poser.db:alembic/versions wuttjamaican.db:alembic/versions
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Note that is really specifying 3 different packages, and the sequence matters (*):
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * ``wutta_continuum.db:alembic/versions``
 | 
					
						
							|  |  |  | * ``poser.db:alembic/versions``
 | 
					
						
							|  |  |  | * ``wuttjamaican.db:alembic/versions``
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | (*) While it does seem to matter, this is not yet fully understood.
 | 
					
						
							|  |  |  | You may need to experiment.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In any case once you've added the Alembic settings you can migrate schema:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: sh
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    alembic -c /path/to/my.conf upgrade heads
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | If you have multiple packages for schema (as shown above) and you get
 | 
					
						
							|  |  |  | errors here, you may need to try a different package sequence in
 | 
					
						
							|  |  |  | config.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | But if the migration went okay then you now have a complete app database.
 | 
					
						
							| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Multiple Databases
 | 
					
						
							|  |  |  | ------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Some scenarios may require multiple app databases.  A notable example
 | 
					
						
							|  |  |  | would be a multi-store retail environment, where each store runs a
 | 
					
						
							|  |  |  | separate app but a "host" (master) node has connections to all store
 | 
					
						
							|  |  |  | databases.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Using that example, the host config might look like:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: ini
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    [wutta.db]
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  |    # nb. the localhost ("host") node is default
 | 
					
						
							| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  |    keys = default, store001, store002, store003
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  |    default.url = postgresql://wutta:wuttapass@localhost/wutta-host
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    store001.url = postgresql://wutta:wuttapass@store001/wutta-store
 | 
					
						
							|  |  |  |    store002.url = postgresql://wutta:wuttapass@store002/wutta-store
 | 
					
						
							|  |  |  |    store003.url = postgresql://wutta:wuttapass@store003/wutta-store
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | And to be thorough, each store config might look like:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. code-block:: ini
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    [wutta.db]
 | 
					
						
							|  |  |  |    # nb. the localhost ("store") node is default
 | 
					
						
							|  |  |  |    keys = default, host
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    default.url = postgresql://wutta:wuttapass@localhost/wutta-store
 | 
					
						
							| 
									
										
										
										
											2023-11-24 19:14:48 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 12:19:42 -06:00
										 |  |  |    host.url = postgresql://wutta:wuttapass@host-server/wutta-host
 |