from flask import Flask,session
from flask_sqlalchemy import SQLAlchemy
import config

app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)


class User(db.Model):
    __tablename__  = 'user'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    username = db.Column(db.String(100),nullable=False)

class Article(db.Model):
    __tablename__ = 'article' 
    id = db.Column(db.Integer,primary_key=True,autoincrement=True)
    title = db.Column(db.String(100),nullable=False)   
    content = db.Column(db.Text,nullable=False)
    
    # 关联表,这里要与相关联的表的类型一直, user.id 表示关联到user表下的id字段
    author_id = db.Column(db.Integer,db.ForeignKey('user.id'))
   
   #给这个article模型添加一个author属性(关系表),User为要连接的表,backref为定义反向引用
    author = db.relationship('User',backref=db.backref('articles'),lazy='dynamic')  #lazy表示禁止自动查询        
db.create_all()

@app.route('/')
def index():
  #添加数据
    user1 = User(username="test_flask2")
    db.session.add(user1)
    article = Article(title='eeee',content='cfffff',author_id=1)      #注意,这里的author_id必须存在,即user表下的id字段的内容必须存在
    db.session.add(article)
    db.session.commit()

   #查询数据---常规方法
    article = Article.query.filter(Article.title=="eeee").first()
    author_id = article.author_id
    
    user = User.query.filter(User.id==author_id)      #获取user表的所有数据
    print (user.username)                    #获取User表下的username字段的内容
    
    #通过sqlalchemy实现查询数据
   article = Article.query.filter(Article.title=="eeee").first()
   print (article.author.username)              #打印username字段的内容,

    user = User.query.filter(User.username=="test_flask3").first()
   print (user.articles)        #查询所有的文章(结果为列表),这里需要注意的是这里的articles要与 article表下author字段里的backref设定的articles 字符串相同

    return 'Hello World!'


if __name__ == '__main__':
    app.run(host='192.168.132.130',debug=True)
# 实例2:
#!/usr/bin/env python
#-*-coding:utf-8-*-


import datetime
from movie_project import db

#用户
class User(db.Model):
    __tablename__ ="user"
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(100),nullable=False,unique=True)  #unique代表不能重复,唯一的
    pwd = db.Column(db.String(100),nullable=False)
    email = db.Column(db.String(64),nullable=False,unique=True)
    phone = db.Column(db.String(11),nullable=False,unique=True)
    info = db.Column(db.Text)
    face = db.Column(db.String(100))         #头像
    addtime = db.Column(db.DateTime,index=True,default=datetime.datetime.now)
    uuid = db.Column(db.String(255))

    userlogs = db.relationship('UserLog',backref='user') #外键关系关联
    comments = db.relationship('Comment',backref='user')
    movicols = db.relationship('Moviecol', backref='user')

    def __repr__(self): #定义返回的类型
        return '<user %r>' % self.name

    def check_pwd(self,pwd):
        from werkzeug.security import check_password_hash
        return  check_password_hash(self.pwd,pwd)


#登录日志
class UserLog(db.Model):
    __tablename__ = 'userlog'
    id = db.Column(db.Integer,primary_key=True)
    user_id = db.Column(db.Integer,db.ForeignKey('user.id'))
    ip = db.Column(db.String(30))
    addtime = db.Column(db.DateTime,index=True,default=datetime.datetime.now)

    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.datetime.now)
    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(20),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))                #上映地区
    replease_time = db.Column(db.Date)              #上映时间
    length  = db.Column(db.String(100))
    addtime = db.Column(db.DateTime,index=True,default=datetime.datetime.now)

    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'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(20), unique=True)
    logo = db.Column(db.String(255), unique=True)
    addtime = db.Column(db.DateTime, index=True, default=datetime.datetime.now)
    def __repr__(self):
        return '<preview %r>' %  self.title


#评论

class Comment(db.Model):
    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.datetime.now)
    def __repr__(self):
        return '<content %r>' %  self.content

#电影收藏

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.datetime.now)

    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(20),unique=True) #权限名称
    url = db.Column(db.String(255),unique=True)
    addtime = db.Column(db.DateTime, index=True, default=datetime.datetime.now)

    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(20), unique=True)  # 权限名称
    auths = db.Column(db.String(600))
    addtime = db.Column(db.DateTime, index=True, default=datetime.datetime.now)

    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), nullable=False, unique=True)  # unique代表不能重复,唯一的
    pwd = db.Column(db.String(100), nullable=False)
    is_super = db.Column(db.SmallInteger)  #是否为超级管理员
    role_id = db.Column(db.Integer,db.ForeignKey('role.id'))
    addtime = db.Column(db.DateTime, index=True, default=datetime.datetime.now)

    adminlogs = db.relationship('Adminlog',backref='admin')
    adminoption = db.relationship('Oplogs', backref='admin')

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

    def check_pwd(self,pwd):
        from werkzeug.security import check_password_hash
        return  check_password_hash(self.pwd,pwd)
#管理员登录日志

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(30))
    addtime = db.Column(db.DateTime, index=True, default=datetime.datetime.now)

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

#操作日志

class Oplogs(db.Model):
    __tablename__ = 'oplogs'
    id = db.Column(db.Integer, primary_key=True)
    admin_id = db.Column(db.Integer, db.ForeignKey('admin.id'))
    ip = db.Column(db.String(30))
    reason = db.Column(db.String(600))  #操作原因
    addtime = db.Column(db.DateTime, index=True, default=datetime.datetime.now)

    def __repr__(self):
        return '<oplog %r>' % self.id


if __name__ == '__main__':
    db.create_all()
    # from werkzeug.security import generate_password_hash
    # role = Role(
    #     name="超级管理员",
    #     auths = ''
    # )
    # admin = Admin(
    #     name="test",
    #     pwd=generate_password_hash("test"),
    #     is_super=0,
    #     role_id=1
    # )
    # db.session.add(role)
    # db.session.add(admin)
    # db.session.commit()