在 Postgres 中查询来自 schema.table 的数据

Query data from schema.table in Postgres

我是 sqlalchemy 的新手,我遇到了一个关于 Postgres 数据库的问题。我可以成功连接到 postgresql 数据库,我想我已经将引擎定向到我想要的模式。

cstr = f"postgresql+psycopg2://{username}:{password}@{server}:{port}/{database}"
engine = create_engine(cstr,connect_args={'options': '-csearch_path={}'.format("schema_name")},echo=True)
con = engine.connect()

print(con.execute('SELECT * FROM table_name'))

这会打印出正确的 schema_name。

insp = inspect(con)
print(insp.default_schema_name)

但是,我仍然收到错误消息,提示 table 不存在。

sqlalchemy.exc.ProgrammingError: (psycopg2.errors.UndefinedTable) relation "table_name" does not exist

我也试过不使用 ,connect_args={'options': '-csearch_path={}'.format("google")} 子句并在 sql 查询中使用 schema_name.table_name。出现同样的错误。它不是本地数据库,所以除了从中获取数据外,我无法对数据库执行任何操作。我在这里应该做什么?

我不知道你的框架炼金术,但正确的查询应该是这样的:

SELECT table_name FROM information_schema.tables WHERE table_schema='public' 

引用docs

有趣的是,我搜索了几个小时的答案并决定改为提问。紧接着,我找到了解决方案。以防万一有人对答案感兴趣。我从这个答案中得到了我的解决方案

print(con.execute("""SELECT DISTINCT "column_name" FROM schema_name."table_name";"""))

这是实现的方法,带有大量引号

您可以让 SQLAlchemy 为您完成工作,而不是在查询中手动引用标识符。

鉴于此 table 和数据:

test# create table "Horse-Bus" (
test(#   id integer generated always as identity,
test(#   name varchar,                                                                                                       
test(#   primary key(id)                                                                                                     
test(# );
CREATE TABLE
test#
test# insert into "Horse-Bus" (name) values ('Alice'), ('Bob'), ('Carol');
INSERT 0 3

您可以像这样创建 Table object and query 它:

>>>import sqlalchemy as sa
>>> engine = sa.create_engine('postgresql:///test', echo=False, future=True)
>>> tbl = sa.Table('Horse-Bus', sa.MetaData(), autoload_with=engine)
>>> with engine.connect() as conn:
...     rows = conn.execute(sa.select(tbl))
...     for row in rows:
...         print(row)
... 
(1, 'Alice')
(2, 'Bob')
(3, 'Carol')
>>>