python - 在 Flask 中使用外键创建堆栈
问题描述
我有一个表客户和表覆盖率。一个客户可以有很多覆盖范围,所以我尝试创建一个一对多的关联。每个类表都在单独的模型 customer.py 和 coverage.py 中创建,它们都在同一个目录模型中:
1-客户模型:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
Base = declarative_base()
class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(Integer, unique=True)
networkList = Column(String(255), unique=False)
coverages = relationship('Coverage', backref='customer_fk')
def __init__(self, name=None, networkList=None):
self.name = name
self.networkList = networkList
def __repr__(self):
return "<Customer(name='%s', networkList='%s')>" % (self.name, self.networkList)
2- 覆盖模型:
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Coverage(Base):
__tablename__ = 'coverage'
id = Column(Integer, primary_key=True)
alias = Column(String(5), unique=False)
cov = Column(Integer, unique=False)
customer_fk = Column(Integer, ForeignKey('customer.id'))
def __init__(self, alias=None, cov=None, customer_fk=None):
self.alias = alias
self.cov = cov
self.customer_fk = customer_fk
def __repr__(self):
return "<Coverage(alias='%s', cov='%s', customer_fk='%s')>" % (self.alias, self.cov, self.customer_fk)
3-主程序(app.py):
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from models.agreements import Base, Agreements
from models.customer import Base, Customer
from models.country import Base, Country
from models.coverage import Base, Coverage
from database.agreementDetails import AgreementDetails
app = Flask(__name__)
# app.config['SQLALCHEMY_DATABASE_URI'] =
'mysql://root:Walid78!@192.168.43.201/steeringiot'
app.config['SQLALCHEMY_DATABASE_URI'] =
'mysql://root:Walid78!@localhost/steeringiot'
db = SQLAlchemy(app)
@app.before_first_request
def setup():
# Recreate database each time for demo
Base.metadata.drop_all(bind=db.engine)
Base.metadata.create_all(bind=db.engine)
# define the json file to parse
# jsonurl =
#'/home/walid/devops/steeringiot/static/data/tiers_VFGroup.json'
#
# # Start Parsing the agreement details and commit into database
# steeringiot:
# agreementDetails = AgreementDetails()
# agrs = agreementDetails.getAgreementsDetails(jsonurl)
# db.session.add(Agreements(agrs[0], agrs[1], agrs[2], agrs[3],
# agrs[4], agrs[5], agrs[6], agrs[7], agrs[8]))
db.session.commit()
db.session.remove()
@app.route('/')
def root():
agreements = db.session.query(Agreements).all()
return u"<br>".join([u"{0}: {0}".format(agreement.agreementId) for
agreement in agreements])
if __name__ == '__main__':
app.run('127.0.0.1', 5000, debug=True)
4- 我收到以下错误的堆栈: sqlalchemy.exc.NoReferencedTableError: Foreign key associated with column 'coverage.customer_fk' could not find table 'customer' 用于生成目标列 'id' 的外键
和表客户,覆盖范围没有被创建......
谢谢你们的帮助!!
解决方案
未经测试。
1-客户模型:
from flask import current_app as app
from sqlalchemy.orm import relationship
db = app.db
class Customer(db.Model):
__tablename__ = 'customer'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.Integer, unique=True)
networkList = db.Column(db.String(255), unique=False)
coverages = db.relationship('Coverage', backref='customer_fk')
def __init__(self, name=None, networkList=None):
self.name = name
self.networkList = networkList
def __repr__(self):
return "<Customer(name='%s', networkList='%s')>" % (self.name, self.networkList)
2- 覆盖模型:
from flask import current_app as app
db = app.db
class Coverage(db.Model):
__tablename__ = 'coverage'
id = db.Column(db.Integer, primary_key=True)
alias = db.Column(db.String(5), unique=False)
cov = db.Column(db.Integer, unique=False)
customer_fk = db.Column(db.Integer, db.ForeignKey('customer.id'))
def __init__(self, alias=None, cov=None, customer_fk=None):
self.alias = alias
self.cov = cov
self.customer_fk = customer_fk
def __repr__(self):
return "<Coverage(alias='%s', cov='%s', customer_fk='%s')>" % (self.alias, self.cov, self.customer_fk)
3-主程序(app.py):
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] =
'mysql://root:[yourpassword]@localhost/steeringiot'
db = SQLAlchemy(app)
app.db = db
with app.app_context():
from models.agreements import Agreements
from models.customer import Customer
from models.country import Country
from models.coverage import Coverage
@app.before_first_request
def setup():
# Recreate database each time for demo
db.drop_all()
db.create_all()
@app.route('/')
def root():
agreements = db.session.query(Agreements).all()
return u"<br>".join([u"{0}: {0}".format(agreement.agreementId) for
agreement in agreements])
if __name__ == '__main__':
app.run('127.0.0.1', 5000, debug=True)
使用理由app.app_context()
:https ://stackoverflow.com/a/44532790/2644759
推荐阅读
- python - 如果键相等,则合并两个字典
- google-apps-script - 时间触发器复制粘贴
- r - rlang:在 tidyr 联合函数中引用 var
- c++ - 捕获窗口的屏幕截图,不包括某些 HWND 的样式 (WS_SYSMENU)
- python - Python Kivy - 无法将屏幕(ScreenManager)的TextInput值提交到另一个屏幕的列表视图
- java - 找不到 Hadoop Java 类
- php - cURL -F 标签等效于 PHP
- javascript - 将 HTML 转换为 JavaScript (.createElement) 的工具?
- c++ - 如何使用 CMake 获得包含所有项目的 VS 解决方案和单个项目的解决方案
- libreoffice-calc - 如何在 Libre Office Calc 中处理时间值