我想用一些静态数据填充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()