当前位置 : 主页 > 网络安全 > 测试自动化 >

SQLAlchemy automap:性能的最佳实践

来源:互联网 收集:自由互联 发布时间:2021-06-22
我正在围绕现有( mysql)数据库构建一个 python应用程序,并使用automap来推断表和关系: base = automap_base() self.engine = create_engine( 'mysql://%s:%s@%s/%s?charset=utf8mb4' % ( config.DB_USER, config.DB_PASSWD, co
我正在围绕现有( mysql)数据库构建一个 python应用程序,并使用automap来推断表和关系:

base = automap_base()

    self.engine = create_engine(
        'mysql://%s:%s@%s/%s?charset=utf8mb4' % (
            config.DB_USER, config.DB_PASSWD, config.DB_HOST, config.DB_NAME
        ), echo=False
    )

    # reflect the tables
    base.prepare(self.engine, reflect=True)

    self.TableName = base.classes.table_name

使用这个我可以做session.query(TableName)等事情……
但是,我担心性能,因为每次应用程序运行它都会再次进行整个推理.

>这是合法的担忧吗?
>如果是这样,是否有可能“缓存”Automap的输出?

我认为“反映”数据库的结构不是要走的路.除非你的应用程序试图从结构中“推断”事物,比如对源文件进行静态代码分析,否则就没有必要了.在运行时反映它的另一个原因是使用SQLAlchemy开始“使用”数据库的时间减少了.然而:

另一种选择是使用像SQLACodegen(https://pypi.python.org/pypi/sqlacodegen)这样的东西:

它将“反映”您的数据库一次,并创建一组99.5%准确的声明性SQLAlchemy模型供您使用.但是,这确实要求您随后使模型与数据库的结构保持同步.我认为这并不是一个大问题,因为你已经在使用的表是稳定的,因此运行时反映它们的结构不会对你的程序造成太大影响.

生成声明性模型本质上是反射的“缓存”.只是SQLACodegen将其保存为一组非常易读的类字段而不是内存中的数据.即使改变了结构,并且我自己对生成的声明性模型进行了“更改”,每当我进行数据库更改时,我仍然会在项目中使用SQLACodegen.这意味着我的模型通常在彼此之间保持一致,并且由于复制粘贴,我没有诸如拼写错误和数据不匹配之类的内容.

网友评论