#python #postgresql #numpy #psycopg2 #recarray
#python #postgresql #numpy #psycopg2 #перенастройка
Вопрос:
Просто хотелось бы получить краткое представление о наилучшем, то есть наименее кодируемом, способе получения большого количества данных в повторном преобразовании в postgres с использованием psycopg2. Я видел кое-что, используя cast, но на самом деле я думал, что это будет проще простого, и я мог бы найти что-нибудь хорошее в Интернете.
Например, данные переписи с 200 переменными считываются в повторном преобразовании с разными типами данных для многих столбцов. Я хочу просто просмотреть имена столбцов и типы данных и ввести их в postgres.
Также, если есть что-нибудь лучше, чем psycopy2, я открыт для предложений.
Это то, что я нашел, хотя оно переходит в sqlight и неправильным способом.
elif driver=='sqlite3':
tups=cur.fetchall()
if len(tups)>0:
_cast = {types.BooleanType: numpy.bool,
types.IntType: numpy.int32,
types.LongType: numpy.int64,
types.FloatType: numpy.float64,
types.StringType: numpy.str,
types.UnicodeType: numpy.str}
try:
typelist=[_cast[type(tmp)] for tmp in tups[0]]
except KeyError:
raise Exception("Unknown datatype")
res = numpy.core.records.array(tups)
else:
return None
res=[res[tmp] for tmp in res.dtype.names]
except BaseException:
Ответ №1:
Psycopg можно расширить с помощью нового адаптера (когда вы хотите передать объект Python в Postgres) или нового typecaster (когда вы хотите читать из Postgres и получать объекты Python).
Похоже, вам нужно зарегистрировать некоторые из существующих адаптеров для типов numpy, например:
>>> psycopg2.extensions.register_adapter(numpy.int32, psycopg2._psycopg.AsIs)
>>> psycopg2.extensions.adapt(numpy.int32(42)).getquoted()
'42'
>>> psycopg2.extensions.register_adapter(numpy.str, psycopg2._psycopg.QuotedString)
>>> psycopg2.extensions.adapt(numpy.str("Hi 'quote'")).getquoted()
"'Hi ''quote'''"
С помощью этих регистраций вы можете использовать типы numpy непосредственно в качестве параметров запроса.
Вы можете получить более подробную информацию и помощь в Списке рассылки.