如何用SQLAlchemy反射Snowflake跨库表并实现数据插入?
解决方案
要解决跨数据库表反射及生成全限定名称SQL的问题,你可以直接在反射表时将数据库名+schema名作为schema参数传入,无需切换当前数据库,具体操作如下:
修正后的完整代码
from sqlalchemy import create_engine, MetaData, Table, text from snowflake.sqlalchemy import URL from sqlalchemy.sql import select, insert engine = create_engine(URL( account="my_account", user="my_username", password="my_password", warehouse="my_warehouse", role="my_role", )) metadata = MetaData() # 直接指定db1.schema1作为schema参数反射表 tablea = Table("tablea", metadata, autoload_with=engine, schema="db1.schema1") tableb = Table("tableb", metadata, autoload_with=engine, schema="db1.schema1") # 反射db2.schema2下的目标表 table = Table("table", metadata, autoload_with=engine, schema="db2.schema2") # 构建查询和插入语句 sql = select(tablea.c.column1, tableb.c.column1) sql = sql.select_from(tablea.join(tableb, tablea.c.join_col == tableb.c.join_col)) # 修正原代码中的语法错误:括号位置错误 insert_stmnt = insert(table).from_select([c.name for c in table.c], sql) with engine.begin() as cnxn: cnxn.execute(insert_stmnt)
关键说明
- Snowflake SQLAlchemy驱动特性:该驱动支持将
database.schema格式的字符串作为schema参数传入,反射后的表会自动带上全限定名称(数据库+schema+表名)。 - 无需切换数据库:删除原代码中
USE DATABASE的语句,避免当前数据库上下文影响表的全限定名称生成。 - 修正语法错误:原代码中
insert_stmnt的括号位置错误,正确写法是insert(table).from_select(列列表, 查询语句)。
验证生成的SQL
执行上述代码后,生成的SQL会与你提供的目标原生SQL完全一致,自动包含所有表的全限定名称,无需手动修改。
内容的提问来源于stack exchange,提问作者James Sheldon
相关产品推荐
相关产品推荐

