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.

Reply via email to