Something like that -- it depends on what is easiest. If writing happens in only a few places, then you can maintain a list of the functions that do writes rather than those that only do reads. You could also take Dave's approach and use the HTTP method to determine the connection:
READ_ONLY_URIS = ['mysql://...1','mysql://...2','mysql://...3'] if request.env.request_method and request.env.request_method == 'GET': db_uri = random.shuffle(READ_ONLY_URIS) else: db_uri = 'mysql://...master' db = DAL(db_uri, ...) Alternatively, you could try changing the connection of the DAL object within a given controller action. I haven't tried it, but maybe something like this: MASTER_URI = 'mysql://...master' def connect_to_master(db, uri=MASTER_URI): if db._uri != uri: master = DAL(uri) db._adapter = master._adapter The above function takes a DAL instance and swaps the ._adapter, which is used to connect to the database. In a given controller, you could then do: def myaction(): connect_to_master(db) [Do db write operations.] return dict() Anthony On Saturday, January 6, 2018 at 8:26:45 AM UTC-5, CDA wrote: > > So given the example below from the book, I would add all the controller > functions that does database read to read_only_actions list? I would have > to continuously maintain this list as my application grows. Is this the > right approach? > > if request.function in read_only_actions: > db = DAL(sample(['mysql://...1','mysql://...2','mysql://...3'], 3)) > elif request.action in read_only_actions: > db = DAL(shuffle(['mysql://...1','mysql://...2','mysql://...3'])) > else: > db = DAL(sample(['mysql://...3','mysql://...4','mysql://...5'], 3)) > > > where 1,2,3 are slaves and 3,4,5 are masters. > > On Jan 6, 2018 3:54 AM, "Dave S" <snidely....@gmail.com> wrote: > > > > On Friday, January 5, 2018 at 7:50:28 PM UTC-8, CDA wrote: >> >> How does web2py select a database to connect to based on the http request >> content? Is it feasible to connect to different databases depending on >> whether it is a read request or a write request? Can you provide example on >> how to do this? >> >> > I would expect that the http request wouldn't directly select a database. > Instead, your controller would know if a select() was being done to satisfy > the request (typical for HTTP GET, but often needed for other reasons), or > an insert or update (often an HTTP POST or HTTP PUT), or a delete (such as > for an HTTP DELETE). But it's your controller that decides what type of DB > operation is required. AIUI. > > /dps > > > >> On Fri, Jan 5, 2018 at 6:35 PM, Anthony <abas...@gmail.com> wrote: >> >>> Do you have doubts about whether it would work? Seems fairly >>> straightforward. >>> >>> >>> On Friday, January 5, 2018 at 3:59:29 PM UTC-5, CDA wrote: >>>> >>>> >>>> Below is an excerpt about horizontal scaling from Chapter 13 in the >>>> book. Has any one successfully implemented this using web2py? >>>> >>>> It is also possible to connect to different databases depending on the >>>> requested action or controller. In a master-slave database configuration, >>>> *some* *action performs only a read* and *some performs both >>>> read/write*. The former can safely connect to a slave db server, while >>>> the latter should connect to a master. So you can do: >>>> >>>> >>>> 1 >>>> 2 >>>> 3 >>>> 4 >>>> 5 >>>> 6 >>>> >>>> if request.function in read_only_actions: >>>> db = DAL(sample(['mysql://...1','mysql://...2','mysql://...3'], 3))elif >>>> request.action in read_only_actions: >>>> db = DAL(shuffle(['mysql://...1','mysql://...2','mysql://...3']))else: >>>> db = DAL(sample(['mysql://...3','mysql://...4','mysql://...5'], 3)) >>>> >>>> >>>> where 1,2,3 are slaves and 3,4,5 are masters. >>>> >>> -- >>> Resources: >>> - http://web2py.com >>> - http://web2py.com/book (Documentation) >>> - http://github.com/web2py/web2py (Source code) >>> - https://code.google.com/p/web2py/issues/list (Report Issues) >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "web2py-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to web2py+un...@googlegroups.com. >>> >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > You received this message because you are subscribed to the Google Groups > "web2py-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to web2py+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > > > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.