将sqlalchemy对象规范化为普通的dict和list
SQLAlchemy-Norm的Python项目详细描述
正在工作。将sqlalchemy对象规范化为普通的dict和list。将sqlalchemy转换为dict而不必痛苦!
pip install sqlalchemy-norm
一个简单代码的示例:
fromyourapp.databaseimportBase,sessionfromsqlalchemy_normimportNormalizableclassUser(Base,Normalizable):# ...me=User('Edward')norm=me.vars()# {"name": "Edward"}users=session.query(User).all()norms=[user.vars()foruserinusers]""" [ {"name": "Edward"}, {"name": "Koala"}, {"name": "Kangaroo"} ] """
如果您愿意,
python setup.py test
为什么?
当我试图从sqlalchemy对象转换为json时,这不是一件容易的事情。 比我预料的要多。如果sqlalchemy对象可以转换为普通对象,它将 最好在大多数转换情况下处理,jsonify在烧瓶中, 尤其是。
贡献
我不擅长python,也不太懂python代码。如果你有 如果对代码有任何想法或意见,请在问题跟踪器上留下问题。 贡献代码总是受欢迎的。
许可证
此软件在新的bsd许可证下获得许可。请参阅LICENSE 文件位于顶级分发目录中,以获取完整的许可证文本。
用法
简单模型
在型号中,
fromdatetimeimportdatetimefromsqlalchemyimportColumn,Integer,String,DateTimefromsqlalchemy_normimportNormalizablefromyourapp.databaseimportBaseclassUser(Base,Normalizable):__tablename__='users'id=Column(Integer,primary_key=True)name=Column(String)nickname=Column(String)password=Column(String)# do not save password as plain stringpoint=Column(Integer)created_at=Column(DateTime)# specify your dict strcutrue inside the model__excludes__=['password']__includes__=['display_name']@propertydefdisplay_name(self):return"%s (%s)"%(self.nickname,self.name)def__init__(self,name,nickname=None,created_at=datetime.now()):self.name=nameself.nickname=nicknameself.created_at=created_at
现在我们可以如下使用:
frommodelsimportUserme=User("Edward","haruair")me.password="strong password"me.point=42print(me.vars())""" { 'id': 1, 'point': 42, 'name': 'Edward', 'nickname': 'haruair', 'created_at': '2016-01-01T00:00:00.123456', 'display_name': 'haruair (Edward)' } """print(me.vars(includes=["password"],excludes=["display_name","name","created_at"]))# {'nickname': 'haruair', 'password': 'strong password', 'point': 100}print(me.vars(includes_only=["display_name"]))# {'display_name': 'haruair (Edward)'}
复杂模型
模型之间的关系,
fromsqlalchemyimportForeignKeyfromsqlalchemy.ormimportrelationship,backrefclassAddress(Base,Normalizable):__tablename__='addresses'id=Column(Integer,primary_key=True)email=Column(String,nullable=False)user_id=Column(Integer,ForeignKey('users.id'))user=relationship("User",backref=backref('addresses',order_by=id))def__init__(self,email):self.email=email
frommodelsimportUser,Addressesfromyourapp.databaseimportsessionme=User("Edward","haruair")me.addresses=[Address("edward@example.com"),Address("haruair@example.com")]session.add(me)session.commit()print(me.vars(includes=["addresses"]))""" { 'id': 1, 'addresses': [ {'email': 'edward@example.com', 'id': 1, 'user_id': 1}, {'email': 'haruair@example.com', 'id': 2, 'user_id': 1} ], 'display_name': 'haruair (Edward)', 'point': None, 'nickname': 'haruair', 'created_at': '2016-09-16T14:16:37.359005', 'name': 'Edward' } """
点符号
支持简单的点符号。不太花哨,但比什么都不值钱。
norm1=me.vars(includes=['primary_address'],excludes=['primary_address.suburb','primary_address.state'])norm2=me.vars(includes_only=['id','primary_address','primary_address.phone'])
如果需要更多示例,请检查tests目录中的测试用例。