ActiveMapper in SQLAlchemy
标签:
ActiveMapper,
SQLAlchemy
ActiveMapper 是SA里面很酷的extension
简化了SA先定义表再mapping的繁琐,又能充分利用SA mapper 的特性
下面是ActiveMapper最基础的用法。
from sqlalchemy.ext.activemapper import ActiveMapper, column, \
objectstore, metadata, one_to_many, one_to_one, many_to_many
metadata.connect('sqlite:///../idtest.db')
metadata.engine.echo = True
user_group = Table("user_group", metadata,
Column("user_id", Integer,
ForeignKey("tg_user.user_id"),
primary_key=True),
Column("group_id", Integer,
ForeignKey("tg_group.group_id"),
primary_key=True))
class Group(ActiveMapper):
class mapping:
__table__="tg_group"
group_id = column(Integer, primary_key=True)
group_name = column(Unicode(16), unique=True)
created = column(DateTime, default=datetime.now)
class User(ActiveMapper):
class mapping:
__table__="tg_user"
user_id = column(Integer, primary_key=True)
user_name = column(Unicode(16), unique=True)
password = column(Unicode(40))
created = column(DateTime, default=datetime.now)
groups = many_to_many("Group", user_group, backref="users")
u = User()
u.user_name = 'test'
g = Group()
g.group_name = 'admin'
g.users.append(u)
objectstore.flush()
在mapper的使用上基本上与SA一般的用法没什么差别.
要注意的就是在申明class的时候,使用one_to_many, many_to_many这些函数来定义各个表之间的关系。
而与数据库的连接,则用sqlalchemy下面的 metadata, objectstore来进行
metadata.connect()连接数据库
objectstore.flush()将对对象的修改提交到数据库
ps:
现在activemapper有一个小bug就是,如果两个表是多对多的关系,
那么不能在两个class下面同时申明many_to_many,
而只要给many_to_many一个backref参数,这个属性就会自动添加到对应的class下
没有评论:
发表评论