【问题标题】:SQLAlchemy: Inserting the results of a query into another tableSQLAlchemy:将查询结果插入另一个表
【发布时间】:2014-03-15 04:36:43
【问题描述】:

所以我从install 表中得到了一些结果,如下所示:

install = metadata.tables['install']  
results = session.query(install) #<sqlalchemy.orm.query.Query object>

我想将这些相同的结果插入到install_archive 表中。

我不完全确定如何执行此操作,因为我不想通过定义 install-archive 对象然后将结果解析为该对象来复制架构。我相信我没有使用 ORM,因为我只是反映(这是正确的术语吗?)表并查询它们。

我能看到的所有教程都使用 ORM。

在伪代码中,一种缓慢的做法是:

for id in result.all():
    install_archive.insert(install(id))

提前致谢!

【问题讨论】:

  • 练习的目的是什么?
  • 范,我正在尝试对install 表进行一些验证,并且只有验证的子集被传递给install_archive 表。我确信这是一件简单的事情“将一些记录从一个表移动到另一个表,但不是全部”,但我似乎无法在文档中找到这样做的方法。我会继续寻找。
  • 您确定需要在 python 中(使用 SA)而不是直接在 MySQL 中进行吗?为什么?
  • 嗯,就是这样,我认为最好用 sqlalchemy 的方式来做?
  • 好吧,我不知道你的具体情况,但除非有一个复杂的逻辑来过滤进入 archive 表的内容和没有的内容,否则我会直接在数据库中执行并避免开销。

标签: python sql mysql sqlalchemy


【解决方案1】:
install_archive \
.insert() \
.from_select(names=['col1', 'col2'], # array of column names that your query returns
             select=session.query(install)) # your query or other select() object

这导致(PostgreSQL 方言)

INSERT INTO install_archive (col1, col2)
SELECT install.col1, install.col2
FROM install;

【讨论】:

    【解决方案2】:

    您可以这样做(更改SELECT 以满足您的需要)。只需确保两个表具有相同的结构即可。

    INSERT INTO `table1` (SELECT * FROM `table2`);
    

    【讨论】:

    • 如果没有原始 sql 但使用 sqlalchemy 表达式,您将如何做到这一点?
    • 我不相信你可以用 SQLAlchemy 做这样的事情。您可以选择所有数据,然后循环并插入到另一个表中,但这将非常低效。你并没有真正从“SQLAlchemy 方式”中获得任何好处。像这样的 SQL 语句具有足够的可移植性。
    • 我认为这不能回答问题。
    • @AndreiSosnin 您能否澄清一下您认为这无法回答问题的原因?
    • 我的意思是,通常它确实可以,但它无法在 SQLAlchemy 的狭窄主题中回答它。因为这个问题实际上并不是通过避免完全解决它来帮助@Oatman 解决他遇到的问题,而是要找出是否可以使用专门的 SQLAlchemy 来解决它。这个问题更多的是关于 SQLAlchemy 和 MySQL,而不是将数据从一个表移动到另一个表的一般问题。
    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    • 2014-10-20
    • 2011-09-15
    相关资源
    最近更新 更多