我对psycopg2 Python模块有点麻烦。我写了一个小代码,使用psycopg2模块从PostgreSQL表中提取一些信息。我想知道表中每列的数据类型:
import os, psycopg2, getpass, sys, string
userpass = getpass.getpass()
# Connect to the database
conn = psycopg2.connect("host=hostname dbname=db user=username password=%s" % (userpass))
cur = conn.cursor()
cur.execute("SELECT * FROM database.table;")
fieldTypes = [desc[1] for desc in cur.description]
print fieldTypes
当我执行此代码时,我得到一个整数列表(即OID)。有没有办法将其转换为更容易理解的东西(例如'str','int','bool'等等。)
答案 0 :(得分:1)
您可以转换" OID"通过简单转换来text
- 只要OID (Object Identifier)实际上是regtype
(已注册类型的OID子类型),就像从函数pg_typeof()
获得的那样。
Postgres通常会将数据类型regtype
的值显示为text
给用户。例如:
SELECT pg_typeof('2013-1-1'::date);
pg_typeof
-----------
date
虽然在内部它是OID:
SELECT pg_typeof('2013-1-1'::date)::oid;
pg_typeof
-----------
1082
如果您的客户不这样做,您可以使用明确的演员强制它:
SELECT pg_typeof('2013-1-1'::date)::text;
SELECT 1082::regtype::text;
目前还不清楚 你实际上是如何检索这些类型的。请考虑此查询以获取完整信息:
SELECT attname
, atttypid::regtype AS base_type
, format_type(atttypid, atttypmod) AS full_type
FROM pg_catalog.pg_attribute
WHERE attrelid = 'public.tbl'::regclass -- your table name here
AND attnum > 0
AND NOT attisdropped
ORDER BY attnum;
attname | base_type | full_type
------------+-----------------------------+-----------------------------
age_id | integer | integer
age | text | text
ageabk | character | character(2)
foo | boolean | boolean
log_up | timestamp without time zone | timestamp without time zone
请注意,format_type(..)
会显示包含修饰符的类型。