我在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这张表
求解答
请问您解决了么,我好像也遇到相似的问题,能不能跟我说一下解决方法,请发送到814953866@qq .com