【问题标题】:Error in One to Many SQLAlchemy database with Flask使用 Flask 的一对多 SQLAlchemy 数据库出错
【发布时间】:2017-01-31 21:42:20
【问题描述】:

我目前正在尝试将项目插入到我的数据库中。我将 SQLlite 和 SQLAlchemy 与 Flask 一起使用,但似乎存在问题。每当我尝试从 cmd 手动插入项目时,都会收到错误消息。

此会话的事务已回滚,因为之前的 刷新期间出现异常。

我已经在我的数据库中实现了一对多的关系,但似乎一直在搞砸。这是我的 Python 代码:

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_bootstrap import Bootstrap

main = Flask(__name__)
db = SQLAlchemy(main)
main.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql://YYYYYYY:XXXXXXX@localhost/address'
main.config['SECRET_KEY'] = 'something-secret'
Bootstrap(main)


class Organisation(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(40), unique=True)
    number = db.Column(db.String(40), unique=True)
    employees = db.relationship('Person', backref='employer', lazy='dynamic')

    def __init__(self, title, email, number):
        self.title = title
        self.email = email
        self.number = number



class Person(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(60), unique=False)
    email = db.Column(db.String(40), unique=True)
    mobile = db.Column(db.String(40), unique=True)
    employer_id = db.Column(db.Integer, db.ForeignKey('organisation.id'))

    def __init__(self, name, email, mobile, employer_id):
        self.name = name
        self.email = email
        self.mobile = mobile
        self.employer_id = employer_id



@main.route('/', methods=['GET'])
def index():
    result = Person.query.all()
    org_result = Organisation.query.all()
    return render_template("index.html", result=result, org_result=org_result)


@main.route('/additems', methods=['GET'])
def additems():
    return render_template('add.html')


@main.route('/add', methods=['GET', 'POST'])
def add():
    person = Person(request.form['name'], request.form['email'], request.form['mobile'])
    db.session.add(person)
    db.session.commit()


if __name__ == "__main__":
    main.run(debug=True)

老实说,我认为我的问题出在 init 函数的某个地方。我已经尝试通过几种方式更改它们:

1.将员工添加为 self.employees = employees 并尝试直接输入组织为: organisation_one=Organisation(title="XX",email="xx@mail.com",number="3838",employees=person_one) 但它甚至在我提交 person_one 之前就回退了一个错误

2.我尝试在个人 __init__ 文件中引用 employer_id,当我尝试添加组织 ID 时,收到错误“无法调整类型”。

我对一对多数据库模型做错了什么?有人可以帮帮我吗?

【问题讨论】:

  • 这些现有表是否在 postgres 数据库中?您是否尝试过为您的数据库模型指定 __tablename__
  • 它们是现有表,我不太确定如何为模型指定 __tablename__
  • 刚刚添加了一些解释作为答案。很确定这会让你解决问题。

标签: python postgresql flask sqlalchemy


【解决方案1】:

您的数据库模型需要像这样的__tablename__ 属性:这告诉它数据库中的实际表名是什么。否则 SQLAlchemy 不知道如何为您编写 SQL。

class Organisation(db.Model):
    __tablename__ = 'organisation'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(40), unique=True)
    number = db.Column(db.String(40), unique=True)
    employees = db.relationship('Person', backref='employer', lazy='dynamic')

    def __init__(self, title, email, number):
        self.title = title
        self.email = email
        self.number = number

您还必须在您的 Person 模型的 backref 中引用此表名:

db.ForeignKey('organisation.id'))  # assuming "organisation" is the table name

另外,您的/add 路由不完整,会导致错误:

@main.route('/add', methods=['GET', 'POST'])
def add():
    person = Person(request.form['name'], request.form['email'], request.form['mobile'])
    db.session.add(person)
    db.session.commit()
    # e.g. add some instruction here on what to do...
    flash('Person %s <%s>added!' % (request.form['name'], request.form['email']))
    return redirect(url_for('main.additems'))

【讨论】:

  • 我用添加的代码再次启动了数据库,但是现在当我尝试将一个人添加为:person_seven=Person(name="John",email="john@mail.com",mobile="0393837", employer_id=organisation_seven) 我收到一个错误:init 得到了一个意外的关键字参数'雇主ID'。顺便提一下,我已经成功地将organisation_seven 提交给了数据库。
  • 当我不知道您的数据库的细节时很难提供帮助,但如果 organisation_sevenOrganistion 模型的 SQLAlchemy 实例,那么它需要是:employer_id=organisation_seven.id跨度>
  • 很高兴能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2022-11-05
  • 2013-02-07
  • 2014-10-29
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
相关资源
最近更新 更多