Copy_from无法在aiopg

时间:2017-03-13 16:10:17

标签: postgresql python-3.x python-asyncio aiopg

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

该脚本工作正常,但表中没有行。

如果我评论drop table行,则会引发异常(表已存在)。如果我在PgAdmin中删除了teable,脚本会正常创建它。问题是没有插入行的原因。无论有没有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';")

仍然没有看到任何东西。我已在debug1中将所有内容设置为postgresql.conf,并且只看到了这一点:

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

可能copy_from的工作方式与执行方式不同。 但是如果我创建表语句同步,则会失败:

            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

因此,它确实尝试将数据加载到表中。

我想知道它是否默默无法读取CSV格式。但不知道出了什么问题。

1 个答案:

答案 0 :(得分:1)

带有异步游标的

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