79 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
		
		
			
		
	
	
			79 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Other Databases
							 | 
						||
| 
								 | 
							
								===============
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Connecting to "external" (non-app) :term:`databases<database>`
							 | 
						||
| 
								 | 
							
								essentially works the same as for the :term:`app database`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								WordPress Example
							 | 
						||
| 
								 | 
							
								-----------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								As a somewhat contrived example, let's say the app needs to query a
							 | 
						||
| 
								 | 
							
								WordPress database directly.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								WuttJamaican only reserves a single config file section for itself,
							 | 
						||
| 
								 | 
							
								which may vary (per :term:`app name`) but by default is ``wutta.db``:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. code-block:: ini
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   [wutta.db]
							 | 
						||
| 
								 | 
							
								   default.url = sqlite://
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								But any other config file section is up for grabs.  Some other
							 | 
						||
| 
								 | 
							
								packages may effectively reserve other sections, but if we assume
							 | 
						||
| 
								 | 
							
								nobody has yet reserved the ``wordpress.db`` section, might add
							 | 
						||
| 
								 | 
							
								something like:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. code-block:: ini
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   [wordpress.db]
							 | 
						||
| 
								 | 
							
								   default.url = mysql://wutta:wuttapass@localhost/wordpress
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Then in the app code you can load the connection(s) with
							 | 
						||
| 
								 | 
							
								:func:`~wuttjamaican.db.conf.get_engines()`::
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   from wuttjamaican.conf import make_config
							 | 
						||
| 
								 | 
							
								   from wuttjamaican.db.conf import get_engines
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   config = make_config()
							 | 
						||
| 
								 | 
							
								   engines = get_engines(config, 'wordpress.db')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								As you might imagine, "rinse and repeat" for other types of databases
							 | 
						||
| 
								 | 
							
								besides WordPress.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Multiple Databases
							 | 
						||
| 
								 | 
							
								------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								As with the app database, you can have multiple databases per type.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								To continue with the previous example, let's say you have a
							 | 
						||
| 
								 | 
							
								"production" WordPress site but also a "staging" site and the app must
							 | 
						||
| 
								 | 
							
								query both.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								There should always be a "default" database chosen, so in this case
							 | 
						||
| 
								 | 
							
								we'll choose "production" for that:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								.. code-block:: ini
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   [wordpress.db]
							 | 
						||
| 
								 | 
							
								   keys = default, staging
							 | 
						||
| 
								 | 
							
								   default.url = mysql://wutta:wuttapass@localhost/wordpress
							 | 
						||
| 
								 | 
							
								   staging.url = mysql://wutta:wuttapass@localhost/wordpress_test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Then in the app code you can reference both a la::
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   from sqlalchemy import orm
							 | 
						||
| 
								 | 
							
								   from wuttjamaican.conf import make_config
							 | 
						||
| 
								 | 
							
								   from wuttjamaican.db.conf import get_engines
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   config = make_config()
							 | 
						||
| 
								 | 
							
								   engines = get_engines(config, 'wordpress.db')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   Session = orm.sessionmaker()
							 | 
						||
| 
								 | 
							
								   Session.configure(bind=engines['default'])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   prod_sess = Session()
							 | 
						||
| 
								 | 
							
								   stag_sess = Session(bind=engines['staging'])
							 |