Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python、SQLAlchemy和Postgresql:理解继承_Python_Postgresql_Inheritance_Sqlalchemy - Fatal编程技术网

Python、SQLAlchemy和Postgresql:理解继承

Python、SQLAlchemy和Postgresql:理解继承,python,postgresql,inheritance,sqlalchemy,Python,Postgresql,Inheritance,Sqlalchemy,Python、SQLAlchemy和Postgresql都是最近才出现的(但不是新出现的),并且很难理解继承 当我接管另一个程序员的代码时,我需要了解继承概念工作所必需的内容和位置 我的问题是: 是否可以仅依靠SQLAlchemy进行继承?换句话说,SQLAlchemy可以对创建的Postgresql数据库表应用继承而不指定INHERITS= 声明性_基技术(SQLAlchemy)是正确使用继承所必需的。如果是这样,我们将不得不重写所有内容,所以请不要让我泄气 假设我们可以使用Table ins

Python、SQLAlchemy和Postgresql都是最近才出现的(但不是新出现的),并且很难理解继承

当我接管另一个程序员的代码时,我需要了解继承概念工作所必需的内容和位置

我的问题是:

  • 是否可以仅依靠SQLAlchemy进行继承?换句话说,SQLAlchemy可以对创建的Postgresql数据库表应用继承而不指定INHERITS=

  • 声明性_基技术(SQLAlchemy)是正确使用继承所必需的。如果是这样,我们将不得不重写所有内容,所以请不要让我泄气

  • 假设我们可以使用Table instance、empty Entity Class和mapper(),您能给我一个(非常简单)的例子说明如何正确地完成这个过程(或者链接到一个易于理解的教程-我还没有发现任何简单的教程)

  • 我们工作的现实世界是房地产对象。所以我们基本上有 -一个表imObject(id,createtime) -一个表objectattribute(id、immoobject\u id、oatype) -几个属性表:oa_attributename(oa_id,attributevalue)

    提前谢谢你的帮助


    Vincent

    欢迎来到Stack Overflow:将来,如果您有多个问题;你应该为每个人提供一个单独的职位。如果有助于提供上下文,请随意将它们链接在一起

    postgres中的表继承是一件非常不同的事情,它解决了与python中的类继承不同的一组问题,sqlalchemy没有尝试将它们结合起来

    当您在postgres中使用表继承时,您在模式级别上做了一些技巧,以便可以实施比其他方式更复杂的约束;一旦你设计了你的模式;应用程序通常不知道继承;如果插入一行;它只是神奇地出现在父表中(很像视图)。例如,这对于提高某些类型的批量操作的效率非常有用(您可以删除1月份的表)

    这与OOP中的继承(在python或其他语言中,以及关系持久性或其他语言中)有着根本不同的想法。在这种情况下,应用程序知道两种类型是相关的,并且子类型是超类型的允许替代品。等待是一个地址,联系人有地址,因此联系人可以有等待

    您需要哪种(主要是正交的)工具取决于应用程序。你可能两个都不需要,两个都需要


  • Sqlalchemy处理对象继承的机制是灵活和健壮的,如果它与您的特定需求兼容,您应该使用它来支持自建解决方案(对于几乎所有的应用程序都应该如此)

  • 声明性扩展是一种方便;它允许您描述映射表、python类以及二者之间的映射,而不是三者。它使你的代码更加“枯燥”;然而,这只是“经典sqlalchemy”之上的一种方便,从任何角度来看都不是必需的

  • 如果您发现需要从sqlalchemy可见的表继承;映射类与不使用这些功能没有任何区别;具有继承的表仍然是正常关系(如表或视图),可以在不知道python代码中的继承的情况下进行映射


  • 欢迎来到Stack Overflow:将来,如果您有多个问题;你应该为每个人提供一个单独的职位。如果有助于提供上下文,请随意将它们链接在一起

    postgres中的表继承是一件非常不同的事情,它解决了与python中的类继承不同的一组问题,sqlalchemy没有尝试将它们结合起来

    当您在postgres中使用表继承时,您在模式级别上做了一些技巧,以便可以实施比其他方式更复杂的约束;一旦你设计了你的模式;应用程序通常不知道继承;如果插入一行;它只是神奇地出现在父表中(很像视图)。例如,这对于提高某些类型的批量操作的效率非常有用(您可以删除1月份的表)

    这与OOP中的继承(在python或其他语言中,以及关系持久性或其他语言中)有着根本不同的想法。在这种情况下,应用程序知道两种类型是相关的,并且子类型是超类型的允许替代品。等待是一个地址,联系人有地址,因此联系人可以有等待

    您需要哪种(主要是正交的)工具取决于应用程序。你可能两个都不需要,两个都需要


  • Sqlalchemy处理对象继承的机制是灵活和健壮的,如果它与您的特定需求兼容,您应该使用它来支持自建解决方案(对于几乎所有的应用程序都应该如此)

  • 声明性扩展是一种方便;它允许您描述映射表、python类以及二者之间的映射,而不是三者。它使你的代码更加“枯燥”;然而,这只是“经典sqlalchemy”之上的一种方便,从任何角度来看都不是必需的

  • 如果您发现需要从sqlalchemy可见的表继承;映射类与不使用这些功能没有任何区别;具有继承的表仍然是正常关系(如表或视图),可以在不知道python代码中的继承的情况下进行映射

  • 对于您的#3,您不必声明空的实体类
    mymetadata = sqlalchemy.MetaData()
    myengine = sqlalchemy.create_engine(...)
    
    def named_table(tablename):
      u"return a sqlalchemy.Table object given a SQL table name"
      return sqlalchemy.Table(tablename, mymetadata, autoload=True, autoload_with=myengine)
    
    def new_bound_class(engine, table):
      u"returns a new ORM class (processed by sqlalchemy.orm.mapper) given a sqlalchemy.Table object"
      fieldnames = table.c.__dict__['_data']
      def format_attributes(obj, transform):
        attributes = [u'%s=%s' % (x, transform(x)) for x in fieldnames]
        return u', '.join(attributes)
      class DynamicORMClass(object):
        def __init__(self, **kw):
          u"Keyword arguments may be used to initialize fields/columns"
          for key in kw:
            if key in fieldnames: setattr(self, key, kw[key])
            else: raise KeyError, '%s is not a valid field/column' % (key,)
        def __repr__(self):
          return u'%s(%s)' % (self.__class__.__name__, format_attributes(self, repr))
        def __str__(self):
          return u'%s(%s)' % (str(self.__class__), format_attributes(self, str))
      DynamicORMClass.__doc__ = u"This is a dynamic class created using SQLAlchemy based on table %s" % (table,)
      return sqlalchemy.orm.mapper(DynamicORMClass, table)
    
    def named_orm_class(table):
      u"returns a new ORM class (processed by sqlalchemy.orm.mapper) given a table name or object"
      if not isinstance(table, Table):
        table = named_table(table)
      return new_bound_class(table)
    
    >>> myclass = named_orm_class('mytable')
    >>> session = Session()
    >>> obj = myclass(name='Fred', age=25, ...)
    >>> session.add(obj)
    >>> session.commit()
    >>> print str(obj)  # will print all column=value pairs