生成表的时候没问题,执行插入时,出现外键错误,且报错的说明和插入的根本不是一个地方,请老师指教

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

五四青年

2017-09-26

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


app=Flask(__name__)

app.config["SQLALCHEMY_DATABASE_URI"]="mysql+pymysql://root:123.com@127.0.0.1:3306/movie"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]=True
db=SQLAlchemy(app)

#会员
class User(db.Model):
    __tablename__="user"
    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__="usrelog"
    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"
    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"
    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__="previe"
    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"
    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"
    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"
    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"
    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"
    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) #是否为超级管理员 9为超级管理员
    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__="adminlog"
    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__="oplog"
    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()
    role=Role(
        name = "超级管理员",
        auths=""
        )
    db.session.add(role)
    db.session.commit()

Traceback (most recent call last):

  File "E:\py\film\film\app\models.py", line 180, in <module>

    auths=""

  File "<string>", line 2, in __init__

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\instrumentation.py", line 347, in _new_state_if_none

    state = self._state_constructor(instance, self)

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\util\langhelpers.py", line 764, in __get__

    obj.__dict__[self.__name__] = result = self.fget(obj)

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\instrumentation.py", line 177, in _state_constructor

    self.dispatch.first_init(self, self.class_)

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\event\attr.py", line 256, in __call__

    fn(*args, **kw)

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\mapper.py", line 2982, in _event_on_first_init

    configure_mappers()

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\mapper.py", line 2872, in configure_mappers

    mapper._post_configure_properties()

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\mapper.py", line 1765, in _post_configure_properties

    prop.init()

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\interfaces.py", line 184, in init

    self.do_init()

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\relationships.py", line 1653, in do_init

    self._process_dependent_arguments()

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\relationships.py", line 1710, in _process_dependent_arguments

    self.target = self.mapper.mapped_table

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\util\langhelpers.py", line 764, in __get__

    obj.__dict__[self.__name__] = result = self.fget(obj)

  File "C:\Users\XiPengfei\AppData\Local\Programs\Python\Python36\lib\site-packages\sqlalchemy\orm\relationships.py", line 1639, in mapper

    % (self.key, type(argument)))

sqlalchemy.exc.ArgumentError: relationship 'adminlogs' expects a class or a mapper argument (received: <class 'sqlalchemy.sql.schema.Table'>)

请按任意键继续. . .


写回答

1回答

rustgopy

2017-09-26

同学,你好,在关联的时候一定要注意大小写,我们关联的是类

adminlogs=db.relationship("adminlog",backref="admin") #管理员日志关联外键
oplogs=db.relationship("oplog",backref="admin") #操作日志关联外键

改为

adminlogs=db.relationship("Adminlog",backref="admin") #管理员日志关联外键
oplogs=db.relationship("Oplog",backref="admin") #操作日志关联外键

其他的如有这种问题,请更正。

0
1
五四青年
非常感谢老师的指正,我对这里的语法理解有误。非常感谢老师的耐心
2017-09-27
共1条回复

Python Flask 构建微电影视频网站

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

683 学习 · 663 问题

查看课程