【发布时间】:2018-09-18 12:23:23
【问题描述】:
我必须插入大约。我的 postgres 数据库中每天有 30000 行, 我的数据库中有 4 列,即: id(pkey)、类别、创建日期、更新日期。 我的要求是使用今天的日期和新类别更新更新和类别列(如果 id 存在),否则插入一个新行,其中 createddate 和 updateon 相同。
我找到了 Ilja Everilä 的 [answer]:https://stackoverflow.com/a/44865375/5665430 进行批量更新
insert_statement = sqlalchemy.dialects.postgresql.insert(id_tag)
upsert_statement = insert_statement.on_conflict_do_update(
constraint='id',
set_={ "createddate": insert_statement.excluded.createddate }
)
insert_values = df.to_dict(orient='records')
conn.execute(upsert_statement, insert_values)
它抛出 AttributeError,
Traceback (most recent call last):
File "<ipython-input-60-4c5e5e0daf14>", line 5, in <module>
set_= dict(createddate = insert_statement.excluded.createddate)
File "/home/bluepi/anaconda2/lib/python2.7/site-packages/sqlalchemy/util/langhelpers.py", line 764, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
File "/home/bluepi/anaconda2/lib/python2.7/site-packages/sqlalchemy/dialects/postgresql/dml.py", line 43, in excluded
return alias(self.table, name='excluded').columns
File "/home/bluepi/anaconda2/lib/python2.7/site-packages/sqlalchemy/sql/selectable.py", line 161, in alias
return _interpret_as_from(selectable).alias(name=name, flat=flat)
AttributeError: 'TextClause' object has no attribute 'alias'
我已经尝试过一一更新,如此处所示 http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#postgresql-insert-on-conflict ,但我得到了同样的错误。
请帮助我了解我哪里出错了,在此先感谢。
【问题讨论】:
-
@IljaEverilä 我什么都没做,只是根据我的要求更改了字段,仅此而已。我认为问题出在这行代码 insert_statement.excluded.createddate
-
@IljaEverilä 添加了追溯
-
@IljaEverilä 这是我的表名
-
@IljaEverilä 没听懂
-
@IljaEverilä id_tag 只是我在 postgres 中桌子的鬃毛
标签: python sqlalchemy psql