【发布时间】:2016-02-03 21:13:07
【问题描述】:
我正在使用 PostgreSQL 9.3 和 SQLAlchemy 1.0.11
我的代码如下所示:
import sqlalchemy as sa
engine = sa.create_engine('postgresql+psycopg2://me@myhost/mydb')
conn = engine.connect()
metadata = sa.MetaData()
# Real table has more columns
mytable = sa.Table(
'my_temp_table', metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('something', sa.String(200)),
prefixes=['TEMPORARY'],
)
metadata.create_all(engine)
pg_conn = engine.raw_connection()
with pg_conn.cursor() as cursor:
cursor.copy_expert('''COPY my_temp_table (id, something)
FROM STDIN WITH CSV''',
open('somecsvfile', 'r'))
现在一切正常了——cursor.rowcount 报告了预期的插入行数。我什至可以运行cursor.execute('SELECT count(*) FROM my_temp_table'); print(cursor.fetchone()),它会显示相同的#。问题是当我尝试从 SQLAlchemy 的连接运行查询时,例如
result = conn.execute(sa.text('SELECT count(*) FROM my_temp_table'))
我把它放在哪里都没关系。我尝试了几个地方:
- with 块内
- 在 with 块之外
- 在
cursor.close()之后 - 在
pg_conn.close()之后
似乎没有任何效果 - 无论我从哪里运行查询,它都会出错:
sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) relation "my_temp_table" does not exist
有趣的是,如果我将该代码包装在 try/except 中,那么我可以成功地在 except 块中执行 cursor.execute(...)。
实际上,现在我正在写这个,似乎使用 sqlalchemy 连接 anywhere 无法看到这些表存在。
那是什么?为什么我的 SQLAlchemy 连接看不到这些表,但 postgres (engine.raw_connection()) 可以?
编辑:
更进一步的神秘 - 如果我在metadata.create_all(engine) 之后创建连接,它就可以工作!嗯,有点。
我可以从表格中进行选择,但是当我得到engine.raw_connection() 时,它在.copy_expert 上失败,因为它找不到表格。
【问题讨论】:
标签: python postgresql sqlalchemy temp-tables