SQLAlchemy与PostgreSQL出现错误“无法找到行中的列'attype'”

2 投票
1 回答
2264 浏览
提问于 2025-04-17 20:42

我正在使用SQLAlchemy来连接一个PostgreSQL数据库。我执行了:

>>> my_engine = create_engine("postgresql://username@localhost:5432/dbname")
>>> my_metadata = MetaData(bind = my_engine)

(这个数据库没有设置密码。)这些操作都没有问题,但我却无法获取表的结构:

>>> my_metadata.reflect()

然后我遇到了这个错误:

sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'attype'"

是什么原因导致这个问题,我该怎么解决呢?看起来像是和数据库结构有关,但我搞不清楚。我可以顺利连接到MySQL数据库并获取表的结构,没有任何问题。

补充说明:SqlAlchemy版本是0.9.2,psql服务器是9.2.5,psql客户端是8.4.13,psycopg2版本是2.5.1

补充说明:设置了echo=True

INFO:root:Creating music_engine postgresql://postgres@localhost/musicbrainz_db
INFO:sqlalchemy.engine.base.Engine:select version()
INFO:sqlalchemy.engine.base.Engine:{}
INFO:sqlalchemy.engine.base.Engine:select current_schema()
INFO:sqlalchemy.engine.base.Engine:{}
INFO:sqlalchemy.engine.base.Engine:SELECT CAST('test plain returns' AS VARCHAR(60)) AS anon_1
INFO:sqlalchemy.engine.base.Engine:{}
INFO:sqlalchemy.engine.base.Engine:SELECT CAST('test unicode returns' AS VARCHAR(60)) AS anon_1
INFO:sqlalchemy.engine.base.Engine:{}
INFO:sqlalchemy.engine.base.Engine:show standard_conforming_strings
INFO:sqlalchemy.engine.base.Engine:{}
INFO:sqlalchemy.engine.base.Engine:SELECT relname FROM pg_class c WHERE relkind = 'r' AND 'echonest' = (select nspname from pg_namespace n where n.oid = c.re
lnamespace)
INFO:sqlalchemy.engine.base.Engine:{}
INFO:sqlalchemy.engine.base.Engine:
            SELECT c.oid
            FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE (pg_catalog.pg_table_is_visible(c.oid))
            AND c.relname = %(table_name)s AND c.relkind in ('r','v')

INFO:sqlalchemy.engine.base.Engine:{'table_name': u'status'}
INFO:sqlalchemy.engine.base.Engine:
            SELECT a.attname,
              pg_catalog.format_type(a.atttypid, a.atttypmod),
              (SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid)
                FROM pg_catalog.pg_attrdef d
               WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum
               AND a.atthasdef)
              AS DEFAULT,
              a.attnotnull, a.attnum, a.attrelid as table_oid
            FROM pg_catalog.pg_attribute a
            WHERE a.attrelid = %(table_oid)s
            AND a.attnum > 0 AND NOT a.attisdropped
            ORDER BY a.attnum

INFO:sqlalchemy.engine.base.Engine:{'table_oid': 19271}
INFO:sqlalchemy.engine.base.Engine:
            SELECT t.typname as "name",
               pg_catalog.format_type(t.typbasetype, t.typtypmod) as "attype",
               not t.typnotnull as "nullable",
               t.typdefault as "default",
               pg_catalog.pg_type_is_visible(t.oid) as "visible",
               n.nspname as "schema"
            FROM pg_catalog.pg_type t
               LEFT JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace
            WHERE t.typtype = 'd'

INFO:sqlalchemy.engine.base.Engine:{}

1 个回答

1

这个问题确实和版本有关,但主要是和Python和psycopg2有关,而不是SQLAlchemy或PostgresQL。

我在我的python2.6的库里安装了SQLAlchemy。我设置了PYTHONPATH,所以我以为用python2.6还是python2.7都没关系。然而,实际上是有关系的,因为SQLAlchemy总是会调用python2.6的psycopg2,而为python2.6编译的psycopg2的本地部分和python2.7不兼容。

撰写回答