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

使用sqlalchemy orm从查询创建临时表

朱经武
2023-03-14
问题内容

我可以这样创建一个临时表:

session.execute("CREATE TABLE temptable SELECT existingtable.id, "
    "existingtable.column2 FROM existingtable WHERE existingtable.id<100000")

但是新表不可读,因为它说它没有主键。 existingtable.id是exisitingtable的主键,因此我希望它在temp表中得到相同的处理。

但是,无论如何,我宁愿找到某种ORM方式来执行此操作。鉴于:

temp_table = Table('temptable', metadata, 
    Column('id', Integer, primary_key=True),
    Column('column2', Integer),
    useexisting=True )
class TempTable(object):
    pass
mapper(TempTable, temp_table)
temp_table.create(bind=session.bind, checkfirst=True)
if session.query(TempTable).delete(): #make sure it's empty
    session.commit()

如何temp_tableexistingtable不执行100000session.query.add(TempTable(...))命令的情况下填充一些选定的内容?还是有一种方法可以通过类似于上面的普通SQL版本的查询来创建表?


问题答案:

它不完全是ORM,但为了最初创建表,我将克隆表结构(请参见cloneTable下面的示例)。为了复制数据,我将使用InsertFromSelect示例。

编辑: 自版本0.8.3起,SqlAlchemy支持
开箱即用的Insert.from_select()
。因此,下面的示例中的InsertFromSelect类和相应的访问者可以直接替换,不再需要。由于历史原因,我将原始示例保持不变。

这是一个有效的例子

from sqlalchemy import Table
from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import UpdateBase

class InsertFromSelect(UpdateBase):
    def __init__(self, table, select):
        self.table = table
        self.select = select

@compiles(InsertFromSelect)
def visit_insert_from_select(element, compiler, **kw):
    return "INSERT INTO %s %s" % (
        compiler.process(element.table, asfrom=True),
        compiler.process(element.select)
    )

def cloneTable(name, table, metadata):
    cols = [c.copy() for c in table.columns]
    constraints = [c.copy() for c in table.constraints]
    return Table(name, metadata, *(cols + constraints))

# test data
from sqlalchemy import MetaData, Column, Integer
from sqlalchemy.engine import create_engine
e = create_engine('sqlite://')
m = MetaData(e)
t = Table('t', m, Column('id', Integer, primary_key=True),
          Column('number', Integer))
t.create()
e.execute(t.insert().values(id=1, number=3))
e.execute(t.insert().values(id=9, number=-3))

# create temp table
temp = cloneTable('temp', t, m)
temp.create()

# copy data
ins = InsertFromSelect(temp, t.select().where(t.c.id>5))
e.execute(ins)

# print result
for r in e.execute(temp.select()):
    print(r)


 类似资料:
  • 问题内容: 我有这个查询: 我只想将其存储在临时表中,以便可以对其进行处理。如果任何人都可以仅包括在SQL Server中创建临时表的语法,那将是很好的。 我尝试了不同的方法,但是迷路了,没有得到想要的结果。 问题答案: 如果您只想在查询中创建一个临时表,以使您可以对存储到其中的结果进行某些操作,则可以执行以下操作: 在查询顶部,然后执行

  • 操作步骤: 菜单栏: Refactor —> Replace Temp with Query...

  • 如果我通过“.ASC”删除组的第二部分,但当我这样做时,数据是不正确的。它为什么要这样做,我如何修复它,并且仍然按照表1分组,除了表3之外,还要先按表1分组。 先进的谢谢! 我有时间接受完整的查询,并将表拉到一个通用表单,以便在没有客户端数据的情况下发布。我能够将模式添加到sqlfiddle中,但如果没有我使用的数据,结果可能会有所不同,而且由于字符的限制,我甚至无法将表前的100行(共7行)放入

  • 本文向大家介绍sql server 创建临时表的使用说明,包括了sql server 创建临时表的使用说明的使用技巧和注意事项,需要的朋友参考一下 临时表产生:A: SELECT INTO和B:CREATE TABLE + INSERT INTO 1. A 要比B 快很多。但是A会锁定tempdb的SYSOBJECTS、SYSINDEXES、SYSCOLUMNS表,在多用户并发的时候,容易产生阻塞

  • 问题内容: 无论如何,我可以写到tempfile并将其包含在命令中,然后关闭/删除它。我想执行命令,例如:some_command / tmp / some-temp-file。 提前谢谢了。 问题答案: 如果需要带有名称的临时文件,则必须使用该功能。然后就可以使用了。有关详细信息,请阅读 http://docs.python.org/library/tempfile.html。