Table 'user' is already defined for this MetaData instance.

来源:3-8 .管理员-登录日志-操作日志数据模型设计

慕码人8635563

2018-05-17

出现如下报错后

Table 'user' is already defined for this MetaData instance.  Specify 'extend_existing=True' to redefine options and columns on an existing Table object.。

按照您说的,在

在每个model下面加上__table_args__ = {"useexisting": True}

比如:

class User(db.Model):

   """会员"""

   __tablename__ = "user"

   __table_args__ = {"useexisting": True}

又出现如下错误:

sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'admin.role_id' could not find table 'role_id' with whi

ch to generate a foreign key to target column 'None'

更改后代码如下

# coding:utf8
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import pymysql

app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@127.0.0.1:3306/movie"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True

db = SQLAlchemy(app)


# 会员
class User(db.Model):
   __tablename__ = "user"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   name = db.Column(db.String(100), unique=True)  # 昵称
   pwd = db.Column(db.String(100))  # 密码
   email = db.Column(db.String(100), unique=True)  # 邮箱
   phone = db.Column(db.String(11), unique=True)  # 手机号码
   info = db.Column(db.Text)  # 个性简介
   face = db.Column(db.String(255), unique=True)  # 头像
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 注册时间
   uuid = db.Column(db.String(255), unique=True)  # 唯一标识符
   userlogs = db.relationship('Userlog', backref='user')  # 会员日志外键关系关联
   comments = db.relationship('Comment', backref='user')  # 评论外键关系关联
   moviecols = db.relationship('Moviecol', backref='user')  # 电影收藏外键关系关联

   def __repr__(self):
       return "<User %r>" % self.name


# 会员登录日志
class Userlog(db.Model):
   __tablename__ = "userlog"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 所属会员
   ip = db.Column(db.String(100))  # 登录IP
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 登录时间

   def __repr__(self):
       return "<Userlog %r>" % self.id


# 标签
class Tag(db.Model):
   __tablename__ = "tag"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   name = db.Column(db.String(100), unique=True)  # 标题
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间
   movies = db.relationship("Movie", backref='tag')  # 电影外键关系关联

   def __repr__(self):
       return "<Tag %r>" % self.name


# 电影
class Movie(db.Model):
   __tablename__ = "movie"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   title = db.Column(db.String(255), unique=True)  # 标题
   url = db.Column(db.String(255), unique=True)  # 地址
   info = db.Column(db.Text)  # 简介
   logo = db.Column(db.String(255), unique=True)  # 封面
   star = db.Column(db.SmallInteger)  # 星级
   playnum = db.Column(db.BigInteger)  # 播放量
   commentnum = db.Column(db.BigInteger)  # 评论量
   tag_id = db.Column(db.Integer,db.ForeignKey('tag.id'))  # 所属标签
   area = db.Column(db.String(255))  # 上映地区
   release_time = db.Column(db.Date)  # 上映时间
   length = db.Column(db.String(100))  # 播放时间
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间
   comments = db.relationship("Comment", backref='movie')  # 评论外键关系关联
   moviecols = db.relationship("Moviecol", backref='movie')  # 收藏外键关系关联

   def __repr__(self):
       return "<Movie %r>" % self.title


# 上映预告
class Preview(db.Model):
   __tablename__ = "preview"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   title = db.Column(db.String(255), unique=True)  # 标题
   logo = db.Column(db.String(255), unique=True)  # 封面
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间

   def __repr__(self):
       return "<Preview %r>" % self.title


# 评论
class Comment(db.Model):
   __tablename__ = "Comment"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   content = db.Column(db.Text)  # 内容
   movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))  # 所属电影
   user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 所属用户
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间

   def __repr__(self):
       return "<Comment %r>" % self.id


# 电影收藏
class Moviecol(db.Model):
   __tablename__ = "moviecol"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   movie_id = db.Column(db.Integer, db.ForeignKey('movie.id'))  # 所属电影
   user_id = db.Column(db.Integer, db.ForeignKey('user.id'))  # 所属用户
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间

   def __repr__(self):
       return "<Moviecol %r>" % self.id


# 权限
class Auth(db.Model):
   __tablename__ = "auth"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   name = db.Column(db.String(100), unique=True)  # 名称
   url = db.Column(db.String(255), unique=True)  # 地址
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间

   def __repr__(self):
       return "<Auth %r>" % self.name


# 角色
class Role(db.Model):
   __tablename__ = "role"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   name = db.Column(db.String(100), unique=True)  # 名称
   auths = db.Column(db.String(600))  # 权限列表
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间
   admins = db.relationship("Admin", backref='role')  # 管理员外键关系关联

   def __repr__(self):
       return "<Role %r>" % self.name


# 管理员
class Admin(db.Model):
   __tablename__ = "admin"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   name = db.Column(db.String(100), unique=True)  # 管理员账号
   pwd = db.Column(db.String(100))  # 管理员密码
   is_super = db.Column(db.SmallInteger)  # 是否为超级管理员,0为超级管理员
   role_id = db.Column(db.Integer, (db.ForeignKey('role_id')))  # 所属角色
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 添加时间
   adminlogs = db.relationship("Adminlog", backref='admin')  # 管理员登录日志外键
   oplogs = db.relationship("Oplog", backref='admin')  # 管理员操作日志外键关系关联

   def __repr__(self):
       return "<Admin %r>" % self.name


# 管理员的登录日志
class Adminlog(db.Model):
   __tablename__ = "userlog"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))  # 所属管理员
   ip = db.Column(db.String(100))  # 登录IP
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 登录时间

   def __repr__(self):
       return "<Adminlog %r>" % self.id


# 操作日志
class Oplog(db.Model):
   __tablename__ = "userlog"
   __table_args__ = {"useexisting": True}
   id = db.Column(db.Integer, primary_key=True)  # 编号
   admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))  # 所属管理员
   ip = db.Column(db.String(100))  # 登录IP
   reason = db.Column(db.String(600))  # 操作原因
   addtime = db.Column(db.DateTime, index=True, default=datetime.utcnow)  # 登录时间

   def __repr__(self):
       return "<Oplog %r>" % self.id


if __name__ == "__main__":
   db.create_all()

去掉在每个model下面加上__table_args__ = {"useexisting": True} 后 即为源码

写回答

1回答

rustgopy

2018-05-30

同学,在每个model中加上extend_existing=True

0
0

Python Flask 构建微电影视频网站

Python 最好用轻量级框架,让你轻松胜任 Python Web 工程师

683 学习 · 663 问题

查看课程