不能将Postgres的ARRAY与SQLAlchemy一起使用

时间:2019-08-13 06:02:15

标签: python postgresql sqlalchemy

我无法通过SQLAlchemy使用以下代码向Postgre添加2D整数数组:

    def create_polygon(x, y, w, h):
        polygon = []
        polygon.append([1, 2])
        return polygon


    engine = create_engine('postgresql://usr:pwd@localhost:5432/db', echo=True)
    meta = MetaData()

    table = Table(
        'table', meta,
        Column('id', Integer, primary_key=True), 
        Column('polygon', ARRAY(Integer, dimensions=2))
    )
    meta.create_all(engine)

    conn = engine.connect()

    for line in lines:            
        insert = zone_by_cam.insert(
            polygon = create_polygon(*line.params)
        )

        conn.execute(insert)

我收到此错误消息:

Additional arguments should be named <dialectname>_<argument>, got 'polygon'

然后我将polygon的名称更改为postgresql_polygon(在文档中找不到该名称),而是改用了这个名称:

Argument 'postgresql_polygon' is not accepted by dialect 'postgresql' on behalf of <class 'sqlalchemy.sql.dml.Insert'>

我该如何解决?谢谢!

1 个答案:

答案 0 :(得分:1)

Table.insert()不接受要插入的值作为关键字参数,并且将它不处理的任何关键字参数传递给Insert的方言特定实现。错误然后告诉您,实现希望这些参数遵循格式<dialectname>_<argument>,但是您给了它polygonpostgresql_polygon不在Postgresql dialect documentation中,因为不存在这样的参数。初始解决方法很简单,可以在关键字参数dict中将值作为values传递,或使用Insert.values()

for line in lines:            
    insert = zone_by_cam.insert().values(
        polygon=create_polygon(*line.params)
    )

    conn.execute(insert)

除了单独的插入,您还可以在一个executemany操作中传递所有“多边形”:

insert = zone_by_cam.insert().values([
    {'polygon': create_polygon(*line.params)} for line in lines
])

conn.execute(insert)