当前位置: 首页 > 面试题库 >

SQLAlchemy中的动态类创建

翟黎明
2023-03-14
问题内容

我们需要创建SQLAlchemy类来访问多个外部数据源,这些数据源会随着时间的推移而增加。我们为核心ORM模型使用了声明式基础,并且我知道我们可以使用autoload
= True手动指定新的ORM类,以自动生成映射。

问题是我们需要能够采用以下方式动态生成它们:

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

stored={}
stored['tablename']='my_internal_table_name'
stored['objectname']='MyObject'

并动态地将其转换为如下所示:

class MyObject(Base):
    __tablename__ = 'my_internal_table_name'
    __table_args__ = {'autoload':True}

我们不希望类的持久时间长于打开连接,执行查询然后关闭连接所需的时间。因此,理想情况下,我们可以将上面“存储”变量中的项目放入数据库中,并根据需要将其提取。另一个挑战是对象名称(例如“
MyObject”)可能会用在不同的连接上,因此我们不能一次定义它并保持它不变。

任何有关如何实现此目标的建议将不胜感激。

谢谢…


问题答案:

您可以MyObject使用3个参数的调用type动态创建:

type(name, bases, dict)

    Return a new type object. This is essentially a dynamic form of the 
    class statement...

例如:

mydict={'__tablename__':stored['tablename'],
        '__table_args__':{'autoload':True},}

MyObj=type(stored['objectname'],(Base,),mydict)
print(MyObj)
# <class '__main__.MyObject'>
print(MyObj.__base__)
# <class '__main__.Base'>
print(MyObj.__tablename__)
# my_internal_table_name
print(MyObj.__table_args__)
# {'autoload': True}


 类似资料:
  • 问题内容: 我对使用关系数据库还很陌生,所以我更喜欢使用一个好的ORM来简化事情。我花时间评估了不同的Python ORM,我认为我需要SQLAlchemy。但是,我已经陷入了精神上的死胡同。 我需要创建一个新表,以与在应用程序的播放器表中创建的播放器的每个实例一起使用。我想我知道如何通过元数据更改表的名称然后调用create函数来创建表,但是我不知道如何将其映射到新的动态类。 有人可以给我一些提

  • 问题内容: 我知道您可以通过提供,为SQLAlchemy的查询构建动态过滤器。 例如 以下是我的问题: 如果我需要通过“大于”或“小于”子句进行查询怎么办?例如(原始SQL): 问题答案: 我建议不要使用,而不是使用,它为您提供了更多选择。 例如(来自手册): 关于您的情况:

  • 我有一些动态创建新div(表单内部的输入)的JS。它工作得很好。我还有一些jquery,它检查下拉输入,如果单击特定的选择,它会显示一个单独的div。它工作得很好。 如果我试图使用jquery在一个动态创建的div中显示一个单独的div,那么它将不起作用。它的第一个实例确实有效,但动态创建的实例都无效。在四处搜索之后,看起来我需要一个代表团,但我似乎无法针对我的具体情况找到它。 JSFIDLE:h

  • 问题内容: 给定一个类名,我想动态创建一个Groovy类,向其添加属性和方法。我使用创建新类 对于我使用的方法 其中it.key是字符串(方法名),it.value是闭包。这很方便,因为我可以指定方法参数类型并进行类型检查。但是,如果不给它赋值,就无法指定动态创建的属性类型。我可以通过显式定义属性的getter和setter来解决此问题。这可行,但是metaClass.name = value或m

  • 问题内容: 我需要动态创建一个类。为了更详细,我需要动态创建Django类的子类。 通过“动态”,我打算基于用户提供的配置创建一个类。 例如 我想要一个命名为该类的子类的类。 该类应具有所选属性的列表。 ....在这种情况下 有什么有用的提示吗?:) 问题答案: 您可以通过调用内置函数并传递适当的参数来动态创建类,例如: 它适用于新型类。我不确定这是否也适用于老式类。

  • 问题内容: 我想编写一个查询,在其中我可以动态地将各种限制传递给SQLA Core。例如,我希望能够在查询中指定或不动态指定。通过限制指令可能会很好,或者可能会有更标准的方法。 我已经阅读了教程和API文档,但我想知道: 对于SQLA Core中的动态限制,什么是惯用合同,它将如何实施? 问题答案: 您可以毫无问题地动态构建查询。例如,您可以执行以下操作: 那里只是限制的字典,如。这将产生一个查询