它不完全是ORM,但为了最初创建表,我将克隆表结构(请参见
cloneTable下面的示例)。为了复制数据,我将使用InsertFromSelect示例。
编辑: 自版本0.8.3起,SqlAlchemy支持
开箱即用的Insert.from_select()。因此,下面的示例中的InsertFromSelect类和相应的访问者可以直接替换,不再需要。由于历史原因,我保留了原始示例。
这是一个有效的例子
from sqlalchemy import Tablefrom sqlalchemy.ext.compiler import compilesfrom sqlalchemy.sql.expression import Updatebaseclass 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 datafrom sqlalchemy import metaData, Column, Integerfrom sqlalchemy.engine import create_enginee = 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 tabletemp = cloneTable('temp', t, m)temp.create()# copy datains = InsertFromSelect(temp, t.select().where(t.c.id>5))e.execute(ins)# print resultfor r in e.execute(temp.select()): print(r)