Hi All,

I'm totally new to the usage of Sharding. I have just tried a sample
with sqlalchemy ShardedSession.

I have two databases (old and new) created with a Projects table. I
have a global shardID that indicates which database to operate on.
shardID - 'n' - for new DB and
shardID - 'o' - for old DB

With the initial shardID pointing to the new DB, I have programmed the
following steps.

Added a record to Projects table, and queried it -- received back the
new DB record

Changed the shardID to 'o'

Added a record to Projects table, and queried it -- received back the
old DB record

Changed the shardID to 'n'

Queried Projects table - Here, as the shardID is pointing to the new
DB i should get records from the newDB projects table, whereas I'm
receiving the record from th old DB

But, If I add another record to the Projects table before this step,
then the qury returns me the new DB records.

Can anyone let me know the reason for this behaviour? Or is there any
mistake in the program?

Below is the code which I have used:

#test_shard.py

from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, String, MetaData
from sqlalchemy.orm import sessionmaker, mapper
from sqlalchemy.ext.horizontal_shard import ShardedSession


#code added to use sharding
shardID     =  'n'  #default
oldDBEngine = create_engine('sqlite:///:memory:')
newDBEngine = create_engine('sqlite:///:memory:')
DBSession   = sessionmaker(class_=ShardedSession)
DBSession.configure(shards={'o':oldDBEngine, 'n':newDBEngine})
metadata    = MetaData()


def shard_chooser(mapper, instance, clause=None):
    return shardID

def id_chooser(query, ident):
    return shardID

def query_chooser(query):
    return shardID

# further configure create_session to use these functions
DBSession.configure(shard_chooser=shard_chooser,
                     id_chooser=id_chooser,
                     query_chooser=query_chooser)


projects_table = Table('projects', metadata,
                         Column('id', Integer, primary_key=True), #
primary key
                         Column('name', String(40)), # foreign key
                         Column('prefix', String(6))
                      )

class Project(object):
    def __init__(self, name, prefix):
        self.name   = name
        self.prefix = prefix

mapper(Project, projects_table)


# create tables
for dbEngine in (newDBEngine, oldDBEngine):
    metadata.drop_all(dbEngine)
    metadata.create_all(dbEngine)


############################################ test_shard
session = DBSession()

print "---------- add to new db with shardID", shardID #default
shardID in 'n' ponting to new database
p1_new = Project('p1_new', 'p1_v1_new')
session.add(p1_new)
session.commit()
print

print "---------- get from new db with shardID", shardID
query    = session.query(Project)
projects = query.all()
for p in projects:
    print p.id, p.name, p.prefix
print

shardID = 'o'
print "---------- add to old db with shardID", shardID
p1_old = Project('p1_old', 'p1_v1_old')
session.add(p1_old)
session.commit()
print

print "---------- get from old db with shardID", shardID
query    = session.query(Project)
projects = query.all()
for p in projects:
    print p.id, p.name, p.prefix
print


shardID = 'n'

##print "---------- add to new db with shardID", shardID
##p2_new = Project('p2_new', 'p2_v2_new')
##session.add(p2_new)
##session.commit()
##print

print "---------- get from new db with shardID", shardID
query    = session.query(Project)
projects = query.all()
for p in projects:
    print p.id, p.name, p.prefix


Thanks,
Gayatri



-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to