首页 > flask中flask_sqlalchemy多对多关系疑问

flask中flask_sqlalchemy多对多关系疑问

我在models里面创建多对多关系的时候,有一个可以创建成功,另外一个创建不成功,不知道问题出在哪儿,代码如下:

user_db = db.table('user_db',db.Model.metadata,
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('db_id', db.Integer, db.ForeignKey('dbs.id'))
)

user_pro = db.Table('user_pro', db.Model.metadata,
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('pro_id', db.Integer, db.ForeignKey('pros.id'))
)

class users(UserMixin,db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    name = db.Column(db.String(64), unique=True)
    password_hash = db.Column(db.String(128))
    useremail = db.Column(db.String(64))
    dbs = db.relationship('dbs', secondary=user_db, backref=db.backref('users', lazy='dynamic'))
    pros = db.relationship('pros', secondary=user_pro, backref=db.backref('users', lazy='dynamic'))
    role  = db.Column(db.String(64),default='1')
    status = db.Column(db.Integer,default=1)
    createtime = db.Column(db.DateTime)
    
    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

    def __repr__(self):
        return '<user %r>' % self.username
 
class pros(db.Model):
    __tablename__ = 'pros'
    id = db.Column(db.Integer, primary_key=True)
    proname = db.Column(db.String(64), unique=True, index=True)
    prodomain = db.Column(db.String(64), unique=True)
    protype = db.Column(db.String(64))
    propath = db.Column(db.String(64))
    tomcatpath = db.Column(db.String(64))
    svnurl = db.Column(db.String(64))
    svnuser = db.Column(db.String(64))
    svnpass = db.Column(db.String(64))
    svnver = db.Column(db.String(64))
    svnoldver = db.Column(db.String(64))
    host_ip = db.Column(db.String(64),db.ForeignKey('hosts.hostip',ondelete='CASCADE'))

    def __repr__(self):
        return '<Pro %r>' % self.proname

class dbs(db.Model):
    __tablename__ = 'dbs'
    id = db.Column(db.Integer, primary_key=True)
    proname = db.Column(db.String(64), unique=True, index=True)
    dburl = db.Column(db.String(64))
    dbname = db.Column(db.String(64))
    dbuser = db.Column(db.String(64))
    dbpass = db.Column(db.String(64))

    def __repr__(self):
        return '<db %r>' %self.proname

运行报错如下:

Yan-Pro:opsmanager yan$ python manage.py  shell
Traceback (most recent call last):
  File "manage.py", line 4, in <module>
    from app.models import users, dbs, pros,hosts
  File "/Users/yan/开发项目/opsmanager/app/models.py", line 8, in <module>
    db.Column('db_id', db.Integer, db.ForeignKey('dbs.id'))
  File "<string>", line 2, in table
  File "/Library/Python/2.7/site-packages/sqlalchemy/sql/selectable.py", line 1334, in __init__
    self.append_column(c)
  File "/Library/Python/2.7/site-packages/sqlalchemy/sql/selectable.py", line 1347, in append_column
    self._columns[c.key] = c
AttributeError: 'MetaData' object has no attribute 'key'

而且如果我把

user_db = db.table('user_db',db.Model.metadata,
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('db_id', db.Integer, db.ForeignKey('dbs.id'))
)

改为下面这个样子(去掉db.Model.metadata,)
user_db = db.table('user_db',
    db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
    db.Column('db_id', db.Integer, db.ForeignKey('dbs.id'))
)

没有报错,但是创建数据之后,没有user_db这张表

求解答

【热门文章】
【热门文章】