flask-sqlAlchemy 创建表

# -*- coding: utf-8 -*-
import os

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 创建flask对象
app = Flask(__name__)
# 创建数据库模型
basedir = os.path.dirname(__file__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data.sqlite') #配置flask的地址
db = SQLAlchemy(app) # 初始化数据库


class User(db.Model): # 创建User表
    id = db.Column(db.Integer, primary_key=True) # 创建id列,并设置为主键
    username = db.Column(db.String(80), unique=True) # 创建username列,设置为不可重复
    email = db.Column(db.String(120), unique=True) # 创建email列,设置为不可重复

    def __init__(self, username, email): # 插入新值的方法
        self.username = username
        self.email = email

    def __repr__(self): # 输出的格式
        return '<User %r>' % self.username

创建表
1.引入SQLAlchemy并绑定到app上
2.class name 是创建表,必须继承db.Model类
3.db.Column用来创建列
4.__init__用来创建插入的方法
5.__repr__用来控制输出的格式

数据库数据类型

类型描述
Integer整形
String (size)字符串
Text文本
DateTimepython datetime对应的时间
Float浮点
Boolean布尔
PickleTypepython 内存对象
LargeBinary二进制数据

数据库字段类型
×unique=True 唯一
×primary_key=True 声明主键,主键自动增长,如果声明两个主键则他们是复合主键
×ForeignKey=('tablea') 声明外键
×db.relationship('tableb', backref='tablea', lazy='dynamic') 声明关联关系
relationship第一个参数是在本表中添加了关联标的信息,可以在本表中直接查询
relationship中的backref参数则是在关联表中添加了本表的信息,可以在关联表中直接查询
relationship中的lazy决定了加载关联信息数据的时机,它有四个选择select(全部加载,默认值),joined(使用join语句作为父级加载关系),subquery(子查询),dynamic(不直接加载,手动加载)

一对多关系

class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',
                                lazy='dynamic')# 这是在通过person查询address的时候惰性查询
#addresses = db.relationship('Address',
        backref=db.backref('person', lazy='dynamic'), lazy='dynamic') # 反向引用也是惰性
class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(50))
    person_id = db.Column(db.Integer, db.ForeignKey('person.id'))
class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    addresses = db.relationship('Address', backref='person',
                                lazy='dynamic')

多对多关系

tags = db.Table('tags',
    db.Column('tag_id', db.Integer, db.ForeignKey('tag.id')),
    db.Column('page_id', db.Integer, db.ForeignKey('page.id'))
)

class Page(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    tags = db.relationship('Tag', secondary=tags, # 第一个参数是第一级关联 secondary是声明第二级的关联
        backref=db.backref('pages', lazy='dynamic')) #

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)

参考文献:
http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm.relationship

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值