So the plan is to have a table users that has the following fields
id - type UUID - 32
fname - varchar(50)
lname - varchar(50)
the code bellow builds the table for me.
1 from sqlalchemy import Table, Column, Integer, String, Sequence, MetaData, ForeignKey, CHAR 2 from sqlalchemy.orm import mapper, sessionmaker, scoped_session 3 from sqlalchemy import create_engine 4 import uuid 5 6 metadata = MetaData() 7 8 users = Table('users', metadata, 9 Column('id', CHAR(32), primary_key=True, autoincrement=True), 10 Column('fname', String(50)), 11 Column('lname', String(50)) 12 ) 13 # orm 14 class Users(object): 15 def __init__(self, fname, lname): 16 assert isinstance(fname, str), 'fname is not a string' 17 assert isinstance(lname, str), 'lname is not a string' 18 self.fname = fname 19 self.lname = lname 20 21 22 23 mapper(Users, users, version_id_col=users.c.id, version_id_generator = lambda version:uuid.uuid4().hex)
line of interest will be
4 - import the uuid module (standard with python 2.6 or higher)
23 - the version_id_col=users.c.id and version_id_generator = lambda version:uuid.uuid4().hex)
the explanation for it is http://www.sqlalchemy.org/docs/orm/mapper_config.html?highlight=uuid#sqlalchemy.orm.mapper
basically you map a temporary integer used my sqlaclhemy and then you transform it into the UUID with a 32 chars in hex.
the rest of the program
24 25 engine = create_engine('sqlite:///:memory:', echo=True) 26 Session = scoped_session(sessionmaker(bind=engine)) 27 metadata.drop_all(engine) 28 metadata.create_all(engine) 29 # my test 30 session = Session() 31 32 33 u = Users('s', 'd'); 34 u1 = Users('s1', 'd2'); 35 36 session.add_all([u1, u]) 37 session.commit() 38 39 session.query(Users).all()
if uuid are better then integers as primary keys I don't think so - at least with mysql taking
into consideration the following article http://www.mysqlperformanceblog.com/2007/03/13/to-uuid-or-not-to-uuid/
but they 'hide' your data from outside and seem to do the job.