如何检查数据库中是否已存在值(SQLAlchemy)

时间:2014-04-12 06:22:37

标签: sql postgresql sqlalchemy

我正在尝试检查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

2 个答案:

答案 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。

enter image description here