我正在尝试检查postgresdb中是否已存在唯一元素。 我在views.py中的方法是
def bestfriend(username):
print username
user = Users.query.filter_by(username = username).first()
if user == None:
flash('bestfriend not found.')
return redirect(url_for('index'))
print user
u = g.user.friend(user)
#print bestfriend.id
if u is None:
#flash('Cannot be friend %(username)s.', username = username)
return redirect(url_for('user', username = username))
if db.session.query(bestfriend).filter(bestfriend.id==u.id).first():
flash('Already Exist')
return redirect(url_for('index'))
db.session.add(u)
db.session.commit()
flash('Your bestfriend has been added.')
return redirect(url_for('user', username = username))
我的model.py是
bestfriend= db.Table('bestfriend',
db.Column('id',db.Integer, primary_key = True),
db.Column('friendid', db.Integer, db.ForeignKey('users.id'))
)
class Users(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key = True)
username = db.Column('username', db.String(20), unique=True , index=True)
password = db.Column('password' , db.String(10))
email = db.Column('email',db.String(50),unique=True , index=True)
registered_on = db.Column('registered_on' , db.DateTime)
posts = db.relationship('Post', backref = 'author', lazy = 'dynamic')
followed = db.relationship('Users',
secondary = followers,
primaryjoin = (followers.c.follower_id == id),
secondaryjoin = (followers.c.followed_id == id),
backref = db.backref('followers', lazy = 'dynamic'),
lazy = 'dynamic')
bestfriends = db.relationship('Users',
secondary = bestfriend,
primaryjoin = (bestfriend.c.friendid == id),
secondaryjoin = (bestfriend.c.id == id),
backref = db.backref('bestfriend', lazy = 'dynamic'),
lazy = 'dynamic')
我能够在数据库表bestfriend中插入值
Table "public.bestfriend"
Column | Type | Modifiers
----------+---------+-----------
id | integer | not null
friendid | integer |
Indexes:
"bestfriend_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"bestfriend_friendid_fkey" FOREIGN KEY (friendid) REFERENCES users(id)
但插入后,我必须使用此行检查记录是否已存在
if db.session.query(bestfriend).filter(bestfriend.id==u.id).first():
我不确定这句话。我已经尝试过类似的解决方案How to elegantly check the existence of an object/instance/variable and simultaneously assign it to variable if it exists in python?,但它对我没用。
我没有收到任何回复,所以添加了更多信息。我只想检查bestfriend表中是否已存在id = 8
app=> select * from bestfriend;
id | friendid
----+----------
8 | 11
答案 0 :(得分:3)
您的语句不起作用,因为bestfriend
是表,而不是映射类。要修复拼写错误,只需将c.
添加到查询中:
exists = db.session.query(bestfriend).filter(bestfriend.c.id==u.id).first()
鉴于您的关系被定义为动态关系,您可以通过以下方式轻松完成:
exists = user.bestfriends.filter(Users.id == u.id).one()
旁注:请注意,您的bestfriend
表格结构不正确,无法实现多对多关系。为此,请按以下方式更改表格的定义:
bestfriend = db.Table('bestfriend',
db.Column('id',db.Integer, db.ForeignKey('users.id'), primary_key = True),
db.Column('friendid', db.Integer, db.ForeignKey('users.id'), primary_key = True)
)
另一个评论:我不理解代码流:您在步骤u = g.user.friend(user)
添加了一个朋友,但稍后检查它是否存在。逻辑不能逆转吗?
答案 1 :(得分:-1)
如果要查找表中是否存在记录,可以这样:
select 1 from table_name;
或更佳
select 1 from table_name where rownum=1;
下图显示了带有输出的查询。
如果有任何数据,它将在该列中返回1。