- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试开发非 ORM 类的 ORM 版本,以便能够将对象存储在数据库中(如果可能的话,还可以检索它)。
from ruamel.yaml import YAMLObject
class User(YAMLObject):
yaml_tag = u'user'
def __init__(self, name, age):
self.name = name
self.age = age
# Other useful methods
我现在想要实现的是一个类似的对象,它的作用类似于Python世界中的User
,但它也可以用作ORM对象,因此能够将它存储在数据库。我巧妙地尝试的是:
Base = declarative_base()
class SQLUser(Base, User):
id = Column(Integer, primary_key=True)
name = Column(String)
age = Column(Integer)
def __init__(self, name, age):
self.name = name
self.age = age
在 Python 2 上运行具有此类层次结构的示例会产生以下错误:
TypeError: Error when calling the metaclass bases metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
我相信这与 YAMLObject
元类有关...但我需要它,因为我还希望能够将这些对象保存为 YAML。对于我读到的有关此错误的信息,我也许应该使用第三个元类,该元类继承自 YAMLObject
元类和 Base
,然后使用它来创建我想要的类。 .
class MetaMixinUser(type(User), type(Base)):
pass
class SQLUser(six.with_metaclass(MetaMixinUser)):
#[...]
不幸的是,这会产生另一个错误:
AttributeError: type object 'SQLUser' has no attribute '_decl_class_registry'
您能指出我的推理有缺陷吗?
最佳答案
如果您赶时间:从 ruamel.yaml
0.15.19 开始,您可以 register classes使用一条语句,无需 YAMLObject
子类化:
yaml = ruamel.yaml.YAML()
yaml.register_class(User)
<小时/>
YAMLObject
是为了与 PyYAML 向后兼容,虽然它可能很方便,但我真的不建议使用它,原因有三个:
YAMLObject
,正如您所注意到的,这可能会干扰其他依赖项Loader
子类化 YAMLObject
所做的唯一真正的事情是为该 yaml_tag
注册一个 constructor
并为该 yaml_tag
注册一个 representer
子类。
如果您运行 Python 2,所有示例均假设 from __future__ import print_function
。
如果您有以下内容,基于子类化 YAMLObject
:
import sys
import ruamel.yaml
from ruamel.std.pathlib import Path
yaml = ruamel.yaml.YAML(typ='unsafe')
class User(ruamel.yaml.YAMLObject):
yaml_tag = u'user'
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def to_yaml(cls, representer, node):
return representer.represent_scalar(cls.yaml_tag,
u'{.name}-{.age}'.format(node, node))
@classmethod
def from_yaml(cls, constructor, node):
# type: (Any, Any) -> Any
return User(*node.value.split('-'))
data = {'users': [User('Anthon', 18)]}
yaml.dump(data, sys.stdout)
print()
tmp_file = Path('tmp.yaml')
yaml.dump(data, tmp_file)
rd = yaml.load(tmp_file)
print(rd['users'][0].name, rd['users'][0].age)
这会让你:
users: [!<user> Anthon-18]
Anthon 18
您无需子类化即可获得完全相同的结果,方法是:
import sys
import ruamel.yaml
from ruamel.std.pathlib import Path
yaml = ruamel.yaml.YAML(typ='safe')
class User(object):
yaml_tag = u'user'
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def to_yaml(cls, representer, node):
return representer.represent_scalar(cls.yaml_tag,
u'{.name}-{.age}'.format(node, node))
@classmethod
def from_yaml(cls, constructor, node):
# type: (Any, Any) -> Any
return User(*node.value.split('-'))
yaml.representer.add_representer(User, User.to_yaml)
yaml.constructor.add_constructor(User.yaml_tag, User.from_yaml)
data = {'users': [User('Anthon', 18)]}
yaml.dump(data, sys.stdout)
print()
tmp_file = Path('tmp.yaml')
yaml.dump(data, tmp_file)
rd = yaml.load(tmp_file)
print(rd['users'][0].name, rd['users'][0].age)
上面使用了SafeLoader
(和SafeDumper
),这是朝着正确方向迈出的一步。但是,如果您有很多类,则添加上面的 XXXX.add_YYY
行会很麻烦,因为这些条目几乎相同,但不完全相同。而且它不处理缺少 to_yaml
和 from_yaml
之一或两者的类。
为了解决上述问题,我建议您在文件 myyaml.py
中创建一个装饰器 yaml_object
和一个辅助类:
import ruamel.yaml
yaml = ruamel.yaml.YAML(typ='safe')
class SafeYAMLObject(object):
def __init__(self, cls):
self._cls = cls
def to_yaml(self, representer, data):
return representer.represent_yaml_object(
self._cls.yaml_tag, data, self._cls,
flow_style=representer.default_flow_style)
def from_yaml(self, constructor, node):
return constructor.construct_yaml_object(node, self._cls)
def yaml_object(cls):
yaml.representer.add_representer(
cls, getattr(cls, 'to_yaml', SafeYAMLObject(cls).to_yaml))
yaml.constructor.add_constructor(
cls.yaml_tag, getattr(cls, 'from_yaml', SafeYAMLObject(cls).from_yaml))
return cls
有了这个你就可以做到:
import sys
from ruamel.std.pathlib import Path
from myyaml import yaml, yaml_object
@yaml_object
class User(object):
yaml_tag = u'user'
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def to_yaml(cls, representer, node):
return representer.represent_scalar(cls.yaml_tag,
u'{.name}-{.age}'.format(node, node))
@classmethod
def from_yaml(cls, constructor, node):
# type: (Any, Any) -> Any
return User(*node.value.split('-'))
data = {'users': [User('Anthon', 18)]}
yaml.dump(data, sys.stdout)
print()
tmp_file = Path('tmp.yaml')
yaml.dump(data, tmp_file)
rd = yaml.load(tmp_file)
print(rd['users'][0].name, rd['users'][0].age)
再次得到相同的结果。如果删除 to_yaml
和 from_yaml
方法,您将获得相同的最终值,但 YAML 略有不同:
users:
- !<user> {age: 18, name: Anthon}
Anthon 18
我无法对此进行测试,但使用此装饰器而不是子类化 YAMLObject
应该在执行以下操作时摆脱 TypeError
:
class SQLUser(Base, User):
<小时/>
1 <子>免责声明:我是本答案中使用的 ruamel.yaml
包的作者。
免责声明2:我并不是真正的18岁,但我确实遵循Brian Adams在this的主打歌中表达的陈述句。专辑
关于python - SQLAlchemy 从非 orm 类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45052997/
请提及(大)ORM 和微 ORM 之间的区别。与大型 ORM 相比,微型 ORM 有何优势?例如。 Entity Framework ORM 和 dapper micro ORM 之间的区别。 最佳答
我有一个名为 User 的模型。我可以从 User 模型扩展另一个模型 Admin/mod 吗?我找到了续集文档,但我没有找到 最佳答案 是的,查看 Associations documentatio
你对数据访问层有什么建议?使用 Entity Framework 和 Hibernate OR 代码生成器(如 Subsonic、.netTiers、T4 等)等 ORM? 最佳答案 对我来说,这很简
我编写了一个代码生成器,它为给定的 SQL Server/CE 数据库生成 POCO 和存储库。没什么花哨的,只有使用经典 ADO.Net 的简单 CRUD 程序。我的问题是,为什么我应该使用像 L2
我扩展了Android.Application类,以便保持状态(将应用程序用作单例)。 但是,我现在想使用Sugar ORM库简化我的数据库访问,但是Sugar文档(http://satyan.git
我正在阅读 OOP 设计模式和框架设计,发现自己对术语 ORM 和持久性框架之间的区别有点不确定。 ORM 是 PF 的一种吗?您可以期待两者有哪些不同的功能? 最佳答案 我将 ORM 定义为将任何数
在 Jboss EAP 7.0 中加载 orm 文件时,我遇到了以下问题,但它在 Weblogic 中工作。 原因:org.hibernate.boot.MappingException:无法解析显式
我一直在研究 Massive ORM。不要忘记,只是看,我还没有做任何编码。 我对保存交易数据的可能性感兴趣。我已经看到可以在一个事务中在同一个表中保存 20 行。但是当我想在单个交易中保存一个订单并
好的。我刚刚开始在我的 Coldfusion 应用程序中使用 ORM。到现在为止一切都很顺利。我遇到了这个障碍。我有这两张表: 这是我用来将数据加载到页面中的代码。 if 的第二部分是默认加载,第一部
我有可以分配许多类别的帖子。所以它是一个多对多的关系。 我想计算每个类别中有多少帖子(符合特定标准),然后对结果进行排序。 我有: Select ( Select count(post.id)
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 8年前关闭。 Improve t
我正在评估如何使用后端的分布式键/值存储来实现某些东西。我希望在支持对象模型的键/值之上有一个层,该对象模型类似于我从对象关系映射器中获得的模型。 任何人都可以指出其他人这样做的任何例子吗?我主要是在
我正在使用 kohana ORM 以便从数据库中获取一些结果。我的问题是:即使我查阅了文档,我也找不到只选择我感兴趣的列的方法。更明确地说,我有: $sale_stock = Model::facto
在 ORM 之前,如果我想显示规范化表的组合输出,我只需执行快速 CFQUERY,将表连接到我想要的字段并显示输出。我只是无法使用 ORM 来解决它。 例如这两个表: customers (id,
异步 ORM 的真正含义是什么?它与常规 ORM 的行为有何不同? 它可以用在什么地方? 最佳答案 这意味着对它的调用会立即返回(不会阻塞)。您会在稍后的某个时间点获得结果,很可能是由于回调触发。
虽然代码优先非常适合部署和开发,但我看不出如何在投入生产后以代码优先的方式插入对域模型所做的更改。 我如何处理我们在生产过程中积累的数据? 我是否应该手动将数据从 A 版架构迁移到 B 版架构?我是否
像学说(事件记录)和Xyster(数据映射器),有什么区别? 最佳答案 不同之处在于域对象与数据访问层的分离程度。使用 ActiveRecord,它是一个对象,这使它变得非常简单。特别是如果您的类一对
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我在 ColdFusion 中有一个持久实体,我需要更新一个属性 property name="createdDateTime" ormtype="date"; 到 property name="cr
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!