gpt4 book ai didi

python - SQLAlchemy 临时表痛苦的解决方案?

转载 作者:太空狗 更新时间:2023-10-29 19:29:12 25 4
gpt4 key购买 nike

似乎 SQLAlchemy 的最大缺点是它在处理临时表时需要倒退几步。例如,一个非常常见的用例是创建一个非常特定于一项任务的临时表,将一些数据放入其中,然后加入它。

对于初学者来说,声明临时表是冗长且有限的。请注意,在这个例子中我不得不编辑它,因为我的类实际上继承了一个基类,所以我在这里给出的可能有点不正确。

@as_declarative(metaclass=MetaBase)
class MyTempTable(object):

__tablename__ = "temp"
__table_args__ = {'prefixes': ['TEMPORARY']}

id = Column(Integer(), primary_key=True)
person_id = Column(BigInteger())
a_string = Column(String(100))

创建它是不直观的:

MyTempTable.__table__.create(session.bind)

我还必须记住明确删除它,除非我做一些有创意的事情让它在 ON COMMIT DROP 下呈现:

MyTempTable.__table__.drop(session.bind)

此外,除非临时表是“顶级”,否则我刚才给出的内容甚至都不起作用。我仍然没有完全弄清楚这一点(因为不想花时间调查为什么它不起作用),但基本上我尝试使用 session.begin_nested() 在嵌套事务中以这种方式创建一个临时表,你最终出现错误,指出关系不存在。但是,我有几个案例,出于单元测试的目的,我在嵌套事务中创建了一个临时表,它们工作得很好。检查 echo 输出,不同之处在于一个在 BEGIN 语句之前呈现,而另一个在它之后呈现。这是使用 Postgresql。

嵌套事务内部的工作方式,坦率地说可以为您节省大量时间,就是键入该死的 sql 并使用 session.execute 执行它。

        session.execute(text(
"CREATE TEMPORARY TABLE temp ("
" id SERIAL,"
" person_id BIGINT,"
" a_string TEXT"
") ON COMMIT DROP;"
))

当然,如果你这样做,你仍然需要一个相应的表模型来使用 ORM 功能,或者必须坚持使用原始 sql 查询,这首先违背了 SQLAlchemy 的目的。

我想知道我是否遗漏了什么,或者是否有人想出了一个更优雅的解决方案。

最佳答案

我在 Core 中使用 ORM。 ORM 保留用于更高级别的操作。对于大量数据和临时表,Core 更方便。示例:

temptbl_name = 'temp_del_dup_pk_{}'.format(datestamp)
temptbl = Table(temptbl_name, metadata, Column('col1', Integer, index=True),..., extend_existing=True)
temptbl.create(engine)

更新这是一个可以动态生成临时表 ORM 定义的简单函数:

def temp_table(name, cols):
args = dict(col1=Column(Integer, index=True),...)
args['__tablename__'] = name
args['__table_args__'] = dict(extend_existing=True)
return type(name, (Base,), args)

镜像现有表的列可能很有用:

def temp_table(name, base_table):
args = {c.name:c.copy() for c in base_table.__table__.c}
...

关于python - SQLAlchemy 临时表痛苦的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34889957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com