Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Flask的一对多SQLAlchemy数据库出错_Python_Postgresql_Flask_Sqlalchemy - Fatal编程技术网

Python 使用Flask的一对多SQLAlchemy数据库出错

Python 使用Flask的一对多SQLAlchemy数据库出错,python,postgresql,flask,sqlalchemy,Python,Postgresql,Flask,Sqlalchemy,我当前正在尝试将项目插入数据库。我正在使用SQLlite和SQLAlchemy与烧瓶,但似乎有一个问题。每当我尝试从cmd手动插入项目时,我都会收到一个错误 由于上一个错误,此会话的事务已回滚 刷新期间出现异常 我在我的数据库中实现了一对多关系,但似乎有什么事情一直搞砸了。以下是我的Python代码: from flask import Flask, render_template, request, redirect, url_for from flask_sqlalchemy import

我当前正在尝试将项目插入数据库。我正在使用SQLlite和SQLAlchemy与烧瓶,但似乎有一个问题。每当我尝试从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=员工,并尝试直接将组织输入为: 组织名称=组织名称=XX,电子邮件=xx@mail.com,number=3838,employees=person\u-one,但它在我提交person\u-one之前就回击了一个错误

2.我已尝试在Person初始化文件中引用雇主id,当我尝试添加组织id时,收到一个无法调整类型的错误


一对多数据库模型有什么不对?有人能帮我吗?

您的数据库模型需要这样一个uuu tablename_uuu属性:这告诉它数据库中实际的表名是什么。否则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
您还必须在个人模型的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'))

这些现有表是否在postgres数据库中?您是否尝试过为数据库模型指定_utablename _u?它们是现有的表,我不太确定如何为模型指定_utablename。只是添加了一些解释作为答案。我用添加的代码再次启动了数据库,但现在当我尝试添加一个人时:person\u seven=Personname=John,email=john@mail.com,mobile=0393837,employer\u id=organization\u seven我收到一个错误:init得到一个意外的关键字参数'employer\u id'。我已经成功地将Organization_seven提交给DB。当我不知道您数据库的细节时,很难提供帮助,但如果Organization_seven是Organization模型的SQLAlchemy实例,那么它必须是:employer_id=Organization_seven.id很高兴我能提供帮助!