Python、SQLAlchemy和Postgresql:理解继承
Python、SQLAlchemy和Postgresql都是最近才出现的(但不是新出现的),并且很难理解继承 当我接管另一个程序员的代码时,我需要了解继承概念工作所必需的内容和位置 我的问题是:Python、SQLAlchemy和Postgresql:理解继承,python,postgresql,inheritance,sqlalchemy,Python,Postgresql,Inheritance,Sqlalchemy,Python、SQLAlchemy和Postgresql都是最近才出现的(但不是新出现的),并且很难理解继承 当我接管另一个程序员的代码时,我需要了解继承概念工作所必需的内容和位置 我的问题是: 是否可以仅依靠SQLAlchemy进行继承?换句话说,SQLAlchemy可以对创建的Postgresql数据库表应用继承而不指定INHERITS= 声明性_基技术(SQLAlchemy)是正确使用继承所必需的。如果是这样,我们将不得不重写所有内容,所以请不要让我泄气 假设我们可以使用Table ins
Vincent欢迎来到Stack Overflow:将来,如果您有多个问题;你应该为每个人提供一个单独的职位。如果有助于提供上下文,请随意将它们链接在一起 postgres中的表继承是一件非常不同的事情,它解决了与python中的类继承不同的一组问题,sqlalchemy没有尝试将它们结合起来 当您在postgres中使用表继承时,您在模式级别上做了一些技巧,以便可以实施比其他方式更复杂的约束;一旦你设计了你的模式;应用程序通常不知道继承;如果插入一行;它只是神奇地出现在父表中(很像视图)。例如,这对于提高某些类型的批量操作的效率非常有用(您可以删除1月份的表) 这与OOP中的继承(在python或其他语言中,以及关系持久性或其他语言中)有着根本不同的想法。在这种情况下,应用程序知道两种类型是相关的,并且子类型是超类型的允许替代品。等待是一个地址,联系人有地址,因此联系人可以有等待 您需要哪种(主要是正交的)工具取决于应用程序。你可能两个都不需要,两个都需要
欢迎来到Stack Overflow:将来,如果您有多个问题;你应该为每个人提供一个单独的职位。如果有助于提供上下文,请随意将它们链接在一起 postgres中的表继承是一件非常不同的事情,它解决了与python中的类继承不同的一组问题,sqlalchemy没有尝试将它们结合起来 当您在postgres中使用表继承时,您在模式级别上做了一些技巧,以便可以实施比其他方式更复杂的约束;一旦你设计了你的模式;应用程序通常不知道继承;如果插入一行;它只是神奇地出现在父表中(很像视图)。例如,这对于提高某些类型的批量操作的效率非常有用(您可以删除1月份的表) 这与OOP中的继承(在python或其他语言中,以及关系持久性或其他语言中)有着根本不同的想法。在这种情况下,应用程序知道两种类型是相关的,并且子类型是超类型的允许替代品。等待是一个地址,联系人有地址,因此联系人可以有等待 您需要哪种(主要是正交的)工具取决于应用程序。你可能两个都不需要,两个都需要
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