我正在围绕现有( mysql)数据库构建一个 python应用程序,并使用automap来推断表和关系: base = automap_base() self.engine = create_engine( 'mysql://%s:%s@%s/%s?charset=utf8mb4' % ( config.DB_USER, config.DB_PASSWD, co
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的输出?
另一种选择是使用像SQLACodegen(https://pypi.python.org/pypi/sqlacodegen)这样的东西:
它将“反映”您的数据库一次,并创建一组99.5%准确的声明性SQLAlchemy模型供您使用.但是,这确实要求您随后使模型与数据库的结构保持同步.我认为这并不是一个大问题,因为你已经在使用的表是稳定的,因此运行时反映它们的结构不会对你的程序造成太大影响.
生成声明性模型本质上是反射的“缓存”.只是SQLACodegen将其保存为一组非常易读的类字段而不是内存中的数据.即使改变了结构,并且我自己对生成的声明性模型进行了“更改”,每当我进行数据库更改时,我仍然会在项目中使用SQLACodegen.这意味着我的模型通常在彼此之间保持一致,并且由于复制粘贴,我没有诸如拼写错误和数据不匹配之类的内容.