在 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')
>>>
我是 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')
>>>