我想使用自动加载功能来使用现有数据库。我知道如何不使用声明性语法(model / _ init _.py):
def init_model(engine):
"""Call me before using any of the tables or classes in the model"""
t_events = Table('events', Base.metadata, schema='events', autoload=True, autoload_with=engine)
orm.mapper(Event, t_events)
Session.configure(bind=engine)
class Event(object):
pass
这工作正常,但我想使用声明性语法:
class Event(Base):
__tablename__ = 'events'
__table_args__ = {'schema': 'events', 'autoload': True}
不幸的是,这样我得到:
sqlalchemy.exc.UnboundExecutionError:此表的MetaData没有绑定任何引擎。通过autoload_with =
将引擎传递到表,或通过metadata.bind = 将元数据与引擎关联
这里的问题是,在导入模型的阶段(在init_model()中可用),我不知道从哪里获取引擎(在autoload_with中使用引擎)。我尝试添加
meta.Base.metadata.bind(engine)
到environment.py,但不起作用。任何人都找到了一些优雅的解决方案?
好吧,我想我明白了。解决方案是在之外声明模型对象model/__init__.py
。我得出的结论是,__init__.py
当从模块中导入某些内容时(在这种情况下model
),将其作为第一个文件导入,这会引起问题,因为模型对象是在init_model()
调用之前声明的。
为了避免这种情况,我在model
模块中创建了一个新文件,例如objects.py
。然后,我Event
在此文件中声明了所有模型对象(如)。
然后,我可以像这样导入我的模型:
from PRJ.model.objects import Event
此外,为了避免autoload-with
为每个表指定,我在以下代码的末尾添加了这一行init_model()
:
Base.metadata.bind = engine
这样,我可以不使用样板代码来声明模型对象,如下所示:
class Event(Base):
__tablename__ = 'events'
__table_args__ = {'schema': 'events', 'autoload': True}
event_identifiers = relationship(EventIdentifier)
def __repr__(self):
return "<Event(%s)>" % self.id
断面 映射器配置概述 讨论了 Mapper construct,它是一种结构,用于定义如何将特定的用户定义类映射到数据库表或其他SQL构造。下面的部分描述了关于声明性系统如何构造 Mapper . 使用声明性定义映射属性 中给出的示例 具有声明性的表配置 说明针对表绑定列的映射;单个列到ORM类属性的映射在内部由 ColumnProperty 构造。还有许多其他类型的映射器属性,最常见的是 rel
正如在 声明性映射 ,声明式样式包括生成映射 Table 对象,或容纳 Table 或其他 FromClause 直接对象。 以下示例假定声明性基类为: from sqlalchemy.orm import declarative_base Base = declarative_base() 下面的所有示例都说明了从上面继承的类 Base . 装饰风格 使用修饰符的声明性映射(无声明基) 下面的
问题内容: 我已有一个包含约50个表的mysql数据库。 除了为每个表手动编写声明式SqlAlchemy类(如此处所示)外,还有没有我可以针对mysql数据库运行的工具/脚本/命令,它将为数据库中的每个表 生成 声明式样式的python类? 仅以一张表为例(理想情况下将为所有50张表生成),如下所示: 是否有工具/脚本/命令可以生成包含以下内容的文本文件: 问题答案: 使用sqlautocode:
问题内容: 我想使用SQLAlchemy的声明性方法映射Tag实体。标签可以有一个父标签(另一个标签)。 我有: 如何添加“父母”关系? 问题答案: 您添加了对父对象的引用,然后创建一个通过来指定方向的关系。这在邻接列表关系下进行了说明。对于声明式,您可以执行以下操作: 如果还需要反向关系,请添加到关系定义。
问题内容: 使用反射而不是调用类构造函数来创建对象是否会导致任何显着的性能差异? 问题答案: 由于反射涉及动态解析的类型,因此无法执行某些Java虚拟机优化。因此,反射操作的性能要比非反射操作慢,因此应避免在对性能敏感的应用程序中经常调用的代码段中。 这是一个简单的测试,我在运行Sun JRE 6u10的计算机上用5分钟的时间破解了它: 结果如下: 请记住,查找和实例化是一起完成的,在某些情况下,
问题内容: 我想从数据库中获取一个对象(如果已存在)(基于提供的参数),或者如果不存在则创建它。 Django的(或)做到了。SQLAlchemy中是否有等效的快捷方式? 我目前正在像这样明确地写出来: 问题答案: 基本上就是这样做的方法,没有快捷方式可供使用的AFAIK。 你可以将其概括为:
如何使用JSDoc注释向TypeScript编译器声明“类型X具有类型Y的所有属性以及这些其他属性”? 鉴于: 当:我通过运行以下命令进行打字检查: 然后:我希望在检查TypeScript时不会出现错误。 但是:事实上,从这个错误判断,它似乎忽略了由AugmentedBase添加的属性,并将其仅视为Base 错误TS2322:Type
请就如何实现这一点提出一个方法? ========================================================================================================= jaspyt提供了3种不同的密码解密方法。我尝试了前两种方法,并且能够成功地加密/解密,但问题是密钥必须作为环境或系统属性传递。 第三种方法是使用自定义J