PostgreSQL - 你如何获得列格式?
PostgreSQL - how do you get the column formats?
我在 x86_64-unknown-linux-gnu 上使用 PostgreSQL 9.3.3,由 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52) 编译,64 位。
我完成了
psycopg2.connect
,得到了光标,可以运行类似于
的代码行
cur.execute('SELECT latitude, longitude, date from db')
table = cur.fetchall()
根据我在 http://initd.org/psycopg/docs/cursor.html 的理解,正在运行
print(cur.description)
应显示每列的 type_code。我怎么听不懂?
我明白了
(Column(name='column_name', type_code=1043, display_size=None, internal_size=-1, precision=None, scale=None, null_ok=None), Column(name='data_type', type_code=1043, display_size=None, internal_size=-1, precision=None, scale=None, null_ok=None))
有人建议我运行另一个解决方案
cur.execute('select column_name, data_type from information_schema.columns')
cur.fetchall()
cols = cur.fetchall()
但是这个 returns 是一个空列表。
这就是我试过的方法。您对获取列格式有何建议?
information_schema.columns
应该为您提供列数据类型信息。
例如,给定此 DDL:
create table foo
(
id serial,
name text,
val int
);
insert into foo (name, val) values ('narf', 1), ('poit', 2);
和此查询(过滤掉元 tables 以获取您的 tables):
select *
from information_schema.columns
where table_schema NOT IN ('information_schema', 'pg_catalog')
order by table_schema, table_name;
将产生 4 行,对于 table foo
-- 我定义的三列,加上一个 FK。
关于 psycopg2,您显示的 information_schema
相关代码看起来应该可以工作...代码的全部内容是什么?我还建议尝试在调试器中单步执行代码(内置的 pdb 没问题,但我建议 pudb,因为它功能更全面且更容易使用,但仍然基于终端。不过,由于它使用的底层模块,它只能在 *nix 平台上运行。
编辑:
我能够使用 psycopg2 从 information_schema
获取 data_type
信息,代码如下:
#!/usr/bin/env python
import psycopg2
import psycopg2.extras
conn = psycopg2.connect("host=<host> dbname=<dbname> user=<user> password=<password>")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("""select *
from information_schema.columns
where table_schema NOT IN ('information_schema', 'pg_catalog')
order by table_schema, table_name""")
for row in cur:
print "schema: {schema}, table: {table}, column: {col}, type: {type}".format(
schema = row['table_schema'], table = row['table_name'],
col = row['column_name'], type = row['data_type'])
我更喜欢使用 DictCursor
s,因为我发现它们更容易使用,但它也应该适用于常规游标——您只需要更改访问行的方式。
此外,关于 cur.description
,returns 一个 元组 的 元组 。如果你想到达那里的type_code,你可以这样做:
print cur.description[0][1]
您要查看的列的索引中的第一个维度,第二个维度是该列中的数据。 type_code
始终为 1。例如,您可以遍历外部元组并始终查看其第二项。
select oid,typname from pg_type;
oid | typname
------+-------------
16 | bool
23 | int4
25 | text
1043 | varchar
1184 | timestamptz
我在 x86_64-unknown-linux-gnu 上使用 PostgreSQL 9.3.3,由 gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52) 编译,64 位。
我完成了
psycopg2.connect
,得到了光标,可以运行类似于
的代码行cur.execute('SELECT latitude, longitude, date from db')
table = cur.fetchall()
根据我在 http://initd.org/psycopg/docs/cursor.html 的理解,正在运行
print(cur.description)
应显示每列的 type_code。我怎么听不懂?
我明白了
(Column(name='column_name', type_code=1043, display_size=None, internal_size=-1, precision=None, scale=None, null_ok=None), Column(name='data_type', type_code=1043, display_size=None, internal_size=-1, precision=None, scale=None, null_ok=None))
有人建议我运行另一个解决方案
cur.execute('select column_name, data_type from information_schema.columns')
cur.fetchall()
cols = cur.fetchall()
但是这个 returns 是一个空列表。
这就是我试过的方法。您对获取列格式有何建议?
information_schema.columns
应该为您提供列数据类型信息。
例如,给定此 DDL:
create table foo
(
id serial,
name text,
val int
);
insert into foo (name, val) values ('narf', 1), ('poit', 2);
和此查询(过滤掉元 tables 以获取您的 tables):
select *
from information_schema.columns
where table_schema NOT IN ('information_schema', 'pg_catalog')
order by table_schema, table_name;
将产生 4 行,对于 table foo
-- 我定义的三列,加上一个 FK。
关于 psycopg2,您显示的 information_schema
相关代码看起来应该可以工作...代码的全部内容是什么?我还建议尝试在调试器中单步执行代码(内置的 pdb 没问题,但我建议 pudb,因为它功能更全面且更容易使用,但仍然基于终端。不过,由于它使用的底层模块,它只能在 *nix 平台上运行。
编辑:
我能够使用 psycopg2 从 information_schema
获取 data_type
信息,代码如下:
#!/usr/bin/env python
import psycopg2
import psycopg2.extras
conn = psycopg2.connect("host=<host> dbname=<dbname> user=<user> password=<password>")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute("""select *
from information_schema.columns
where table_schema NOT IN ('information_schema', 'pg_catalog')
order by table_schema, table_name""")
for row in cur:
print "schema: {schema}, table: {table}, column: {col}, type: {type}".format(
schema = row['table_schema'], table = row['table_name'],
col = row['column_name'], type = row['data_type'])
我更喜欢使用 DictCursor
s,因为我发现它们更容易使用,但它也应该适用于常规游标——您只需要更改访问行的方式。
此外,关于 cur.description
,returns 一个 元组 的 元组 。如果你想到达那里的type_code,你可以这样做:
print cur.description[0][1]
您要查看的列的索引中的第一个维度,第二个维度是该列中的数据。 type_code
始终为 1。例如,您可以遍历外部元组并始终查看其第二项。
select oid,typname from pg_type;
oid | typname
------+-------------
16 | bool
23 | int4
25 | text
1043 | varchar
1184 | timestamptz