Copy_from 无法在 aiopg 中工作

Copy_from not working in aiopg

这是我试图在 aiopg 和数据中执行的查询。我不知道为什么会失败。

脚本工作正常,除了 table 中没有行。

如果我注释 drop table 行,它会引发异常(table 已经存在)。如果我将 teable 放到 PgAdmin 中,脚本会正常创建它。问题是为什么没有插入行。我试过有和没有 sep=',',没有区别。

我试过在postgresql.conf中调日志级别来观察,还是没有效果。执行查询时不会记录任何内容。

cols = ['geopos', 'build_year', 'serial', 'floors_max', 'address']
buff = io.StringIO("""
geopos,series,build_year,address,floors_max
POINT (37.954441 55.725681),ааацуке544,1900,"г. Москва, г. Зеленоград, д. 1306, к. 1",321
POINT (37.657889 55.834376),Индивидуальный,2014,"г. Москва, пр-кт. Мира, д. 188 Б, к. 1",58
POINT (37.527903 55.723237),Индивидуальный,2011,"г. Москва, ул. Мосфильмовская, д. 8",53
POINT (37.511625 55.71232),индивидуальный,1959,"г. Москва, ул. Мосфильмовская, д. 33",1960
POINT (37.520671 55.79848),Индивидуальный,2006,"г. Москва, пер. Чапаевский, д. 3",57
POINT (37.258022 55.964569),,,"обл. Московская, г. Химки, мкр. Сходня, ул. Ленинградская, д. 3",54
POINT (37.427408 55.879187),,,"обл. Московская, г. Химки, ул. Панфилова, д. 15",173"""
)

dsn = 'dbname=wand_driver_dev host=localhost user=culebron password=culebron'

async with aiopg.create_pool(dsn) as pool:
    async with pool.acquire() as conn:
        async with conn.cursor() as cur:
            await cur.execute('drop table if exists test_table')
            await cur.execute('create table test_table (geopos geometry, series text, build_year integer, address text, floors_max integer)')

            buff.seek(0)
            cur.copy_from(buff, 'test_table', sep=',', columns=cols)
            await cur.execute('select * from test_table')
            print(list(cur.fetchall()))  # prints an empty list: []
            conn.commit()

我尝试在查询之前添加这一行:

await cur.execute("set log_min_error_statement TO 'debug1';")

还是什么都没看到。我在 postgresql.conf 中将所有内容都设置为 debug1,但只看到了这个:

culebron@wand_driver_dev STATEMENT:  create table loaded_table (address text, serial text, geopos geometry, build_year integer, floors_max integer)

可能 copy_from 的工作方式与执行方式不同。 但是如果我使 create table 语句同步,它会失败:

            await cur.execute('drop table if exists test_table')
            cur.execute('create table test_table (geopos geometry, series text, build_year integer, address text, floors_max integer)')
            buff.seek(0)
            cur.copy_from(buff, 'test_table', sep=',', columns=cols)

Postgres 驱动程序引发异常:

psycopg2.ProgrammingError: relation "loaded_table" does not exist
LINE 1: select * from loaded_table

因此,它会尝试将数据加载到 table。

不知道它是不是静默读取CSV格式失败了。但是不知道哪里出了问题。

cur.copy_from is not supported 使用异步游标:

@asyncio.coroutine
def copy_from(self, file, table, sep='\t', null='\N', size=8192,
              columns=None):
    raise psycopg2.ProgrammingError(
        "copy_from cannot be used in asynchronous mode")

要引发错误,请在您的代码中添加 await

await cur.copy_from(buff, 'test_table', sep=',', columns=cols)

没有 await,您只是看不到主循环中的错误。

而是使用常规 psycopg