我目前正在尝试将项目插入我的数据库。我正在使用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 =员工并直接尝试输入组织:
organisation_one=Organisation(title="XX",email="xx@mail.com",number="3838",employees=person_one)
但是在我提交person_one
2.我尝试在Person __ init __ 文件中引用 employer_id ,当我尝试添加组织ID时,我发现错误"可以&# 39; t适应类型"。
我对一对多数据库模型做错了什么?有人可以帮助我吗?
答案 0 :(得分: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
您还必须在backref
中为您的Person模型引用此表名:
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'))