gpt4 book ai didi

python - 如何从 sqlalchemy 中的 select 语句创建一个新表?

转载 作者:行者123 更新时间:2023-12-03 15:25:26 27 4
gpt4 key购买 nike

我正在使用 sqlalchemy 的核心功能来编写一些抽象层。层本身需要能够从选择语句创建表。

示例代码:

metadata = MetaData(bind=engine)
table = Table(table_name, metadata, autoload=True, autoload_with=engine)
s = select(table).where(table.c.column_1 > 10)

现在我想要做的是从上面的 select 语句中创建一个新表。我该怎么做?

注意:我也在 https://groups.google.com/forum/#!topic/sqlalchemy/lKDkX68fOqI 上问过这个问题.抱歉交叉发帖

我能想到的唯一方法是编译上面绑定(bind)了参数的 select 语句。手动构造SQL,然后创建表

例如:
sql = str(s.compile(dialect=postgresql.dialect(),
compile_kwargs={"literal_binds": True}
)
)

create_tbl_sql = "CREATE TABLE {0} AS {2}".format(new_table_name, sql)

connection.execute(create_tbl_sql)

当日期时间对象涉及 where 条件时,文字绑定(bind)编译也很痛苦。几乎每当查询中存在无法序列化的内容时。我将不得不解决这个问题。

采取这种方法似乎并不干净。所以我问整个社区他们是否知道更好的东西。

最佳答案

通常我们会继承 DDLElement,但如果您想使用绑定(bind)参数,我们将留在 SQL 元素系统中:

from sqlalchemy.ext.compiler import compiles
from sqlalchemy.sql.expression import ClauseElement, Executable


class CreateTableAs(Executable, ClauseElement):

def __init__(self, name, query):
self.name = name
self.query = query


@compiles(CreateTableAs, "postgresql")
def _create_table_as(element, compiler, **kw):
return "CREATE TABLE %s AS %s" % (
element.name,
compiler.process(element.query)
)

if __name__ == '__main__':
from sqlalchemy import Table, Column, Integer, \
MetaData, create_engine, select

m = MetaData()
t = Table('t', m, Column('x', Integer), Column('y', Integer))

e = create_engine("postgresql://scott:tiger@localhost/test", echo=True)
c = e.connect()
trans = c.begin()

t.create(c)
c.execute(
t.insert(),
[{"x": 1, "y": 2}, {"x": 11, "y": 3}]
)

s = select([t]).where(t.c.x > 10)

c.execute(CreateTableAs('t2', s))

assert c.execute("select x, y from t2").fetchall() == [(11, 3)]
trans.rollback()

输出:
2015-06-01 11:42:55,982 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)
2015-06-01 11:42:55,982 INFO sqlalchemy.engine.base.Engine
CREATE TABLE t (
x INTEGER,
y INTEGER
)


2015-06-01 11:42:55,982 INFO sqlalchemy.engine.base.Engine {}
2015-06-01 11:42:55,985 INFO sqlalchemy.engine.base.Engine INSERT INTO t (x, y) VALUES (%(x)s, %(y)s)
2015-06-01 11:42:55,986 INFO sqlalchemy.engine.base.Engine ({'y': 2, 'x': 1}, {'y': 3, 'x': 11})
2015-06-01 11:42:55,988 INFO sqlalchemy.engine.base.Engine CREATE TABLE t2 AS SELECT t.x, t.y
FROM t
WHERE t.x > %(x_1)s
2015-06-01 11:42:55,988 INFO sqlalchemy.engine.base.Engine {'x_1': 10}
2015-06-01 11:42:55,996 INFO sqlalchemy.engine.base.Engine select x, y from t2
2015-06-01 11:42:55,996 INFO sqlalchemy.engine.base.Engine {}
2015-06-01 11:42:55,997 INFO sqlalchemy.engine.base.Engine ROLLBACK

关于python - 如何从 sqlalchemy 中的 select 语句创建一个新表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30575111/

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