使用Flask SQLAlchemy链接管理系统的数据库

时间:2018-11-15 05:24:15

标签: python flask flask-sqlalchemy

我正在尝试为一家假设的保险代理机构建立一个非常基本的管理系统网站,而我只是无法确定如何组织数据库以使自己能够为用户分配特定保单并具有以下能力:如果代理商内有重新安排,则更新/替换用户,以便可以将策略重新分配给适当的代理商。这也将用于基于登录显示数据。我认为我需要3层。一个用于用户数据的用户表,一个用于存储客户端和策略信息的客户端数据/策略表,然后是一个将分配给策略的任务的表。我需要多个用户才能访问策略,然后该策略应该可以访问任务表中的1行。将用户表和大型客户表包含在任务列中,而不是将任务分开放置在表中会更好吗?我已经为此努力了好几天,所以如果有人可以帮忙,我将非常感激。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SECRET_KEY'] = ''
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'

db = SQLAlchemy(app)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    username = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(50))
    email = db.Column(db.String(50), unique=True)

#Multiple assigned users can access
class Client(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    policy_number = db.Column(db.String(50), unique = True)
    expiration_date = db.Column(db.Datetime)

#Single "client" assigned to single row of tasks based on policy number
class PolicyTasks(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    step1 = db.Column(db.String(50))
    step1_completed = db.Column(db.Boolean)
    step2 = db.Column(db.String(50))
    step2_completed = db.Column(db.Boolean)
    step3 = db.Column(db.String(50))
    step3_completed = db.Column(db.Boolean)
    step4 = db.Column(db.String(50))
    step4_completed = db.Column(db.Boolean)
    step5 = db.Column(db.String(50))
    step5_completed = db.Column(db.Boolean)

我删除了尝试创建关系的代码,因为老实说,它可能更有助于查看基本布局

1 个答案:

答案 0 :(得分:0)

要全神贯注于如何组织数据库以使其能够为用户分配特定策略,请查看Flask网站上的文档。我认为“一对多”下的第二个示例与您要进行的操作http://flask-sqlalchemy.pocoo.org/2.3/models/非常相似。

我建议将表分开放置,不要将它们全部塞在一起。通常,根据我的经验,如果表的属性太多,就无法管理。

这也可能意味着查询时间变慢,因为Client.query.filter_by(username='peter').first()会始终查询客户端数据,策略数据以及您以后需要扔到该表中的所有其他内容,而此时您可能只需要策略数据特定的视图/ API路线。

其他stackoverflow帖子也可能有帮助: database design - when to split tables?