将sqlalchemy对象规范化为普通的dict和list

SQLAlchemy-Norm的Python项目详细描述


Build StatusVersion Status

正在工作。将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目录中的测试用例。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java OnClick用于ListView中的特定项   java如何多次循环相同的TestNG测试。包括课前和课后   java如何在Codenameone中设置BrowserComponent浏览器窗口大小   java Socketchannel始终为空   java以编程方式向JavaFX WebEngine历史添加新条目   java Hibernate+Spring与Oracle一起使用分层查询(从+连接方式开始)   Java中的安卓 getView和Beacon(Estimote)问题   计时器如何在java中设置暂停选项   java为什么输入1000000000000的输出不正确?   java如何在程序执行期间更改log4j2中的日志记录级别   java阻止代码引发XML异常   未找到媒体类型为application/json的java JAX RS MessageBodyWriter   java如何将BuffereImage中的特定颜色(0xFF00FF)设置为透明?   java如何列出web元素,如果网页中没有特定链接的id,如何单击网页中的特定链接?   在Java中读取txt文件时获取EOFEException   java如何避免为每个视图添加inject方法?   JavaSpringController:Facebook上类似文章的永久链接   java在尝试执行脚本时遇到错误“net.serentiybdd.core.exceptions.serentitymanagedexception:No session ID”