如果条目存在则查询PostgreSQL表,否则添加

时间:2017-04-11 22:10:39

标签: python postgresql sqlalchemy

我想用一些静态数据填充PostgreSQL表(这些名称稍后会被我的程序用作参考),但我的代码与我期望的相反。

总之,我的问题是如何查询表中是否存在id等于User的{​​{1}}对象,如果没有,请添加它?

user

其中DBSession = scoped_session(sessionmaker()) # ...plus other configurations parameters if not DBSession.query(User.id==user): print "Adding a new entry." DBSession.add(User(**user)) elif DBSession.query(User.id==user): print "Entry already exists." 是具有多个属性的对象,User是该对象的实例,具有这些属性的特定值。

但是,无论名称是否在表中,我总是属于elif子句。我怀疑这是因为if / elif逻辑将查询的存在视为布尔值,而不是使用该查询的结果。很公平,我想这不是一个有效的方法。

我还尝试使用更明确的user方法,但我遇到了同样的问题(查询似乎被视为布尔而不是被执行并返回结果)。

exists()

不幸的是,打印q = DBSession.query(User).filter(User.id==user) if not DBSession.query(q.exists()): print "Adding a new entry." DBSession.add(User(**user)) else: print "Entry already exists. 只返回DBSession.query(User.id==user),这不是非常有用的信息(只是SQLAlchemy构造的SQL查询)。我试图明确SELECT user.id = %(id_1)s AS anon_1这个SQL查询,但是不成功,我想知道是否有必要明确这样做。

明确执行查询......

execute()

...返回错误:

q = DBSession.query(User.id==user)
DBSession.execute(q)

我现在明白sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt type 'dict' [SQL: 'SELECT user.id = %(id_1)s AS anon_1 \nFROM user'] [parameters: {'id_1': {'first_name': u'Spike', 'last_name': u'Lee'}}] 是用作查询结果句柄的别名,上面的anon_1只是一个变量。

我也尝试了%(id_1)s方法并获得了与上面相同的ProgrammingError。

where()

PS:我在Ubuntu 16.04中使用SQLAlchemy 1.1.6和Python 2.7使用Postgres 9.3。

临时解决方案

我可以计算表中匹配出现的次数(如果计数为0则添加条目),但是更喜欢使用DBSession.query(exists().where(User.id==user)).scalar() ,因为在第一个匹配的条目停止会更有效率而不是整个表格(我的条目无论如何都是独一无二的)。

exists()

0 个答案:

没有答案