0

psycopg2を使用して、recarray内の大量のデータをpostgresに取り込むための最良の、つまり最小のコーディング方法について簡単に説明したいと思います。私はキャストを使っていくつかのものを見たことがありますが、実際にはそれはまっすぐ進むだろうと思い、ウェブ上で何か良いものを見つけることができました。

例では、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:
4

1 に答える 1

2

Psycopg は、新しいアダプター (Python オブジェクトを Postgres に渡したい場合) または新しいタイプキャスター (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 型をクエリ パラメータとして直接使用できます。

メーリング リストで詳細とヘルプを入手できます。

于 2011-05-11T14:06:06.067 に答える