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



我不能将 2D 整数数组添加到 Postgre 使用以下代码和 SQLAlchemy:

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'>

我该如何解决这个问题?谢谢!

Table.insert()

不接受作为关键字参数插入的值,并将它不处理的任何关键字参数传递给方言特定的Insert实现。然后错误告诉您,实现期望这些参数遵循格式<dialectname>_<argument>,但您polygon给了它。postgresql_polygon不在Postgresql方言文档中,因为不存在这样的参数。初始修复很简单,在关键字参数values中将值作为dict传递,或使用Insert.values()

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

除了单独的插入,您还可以在单个执行多个操作中传递所有"多边形":

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

最新更新