我是编程新手,刚刚完成了一些课程和课程,现在正在部署我的第一个应用程序。
我正在使用 Python、Flask 和 FlaskSQLAlchemy。我正在尝试创建表格,但不能。
有什么修复的想法吗?
当我运行应用程序时,后备数据库被创建但为空。
我的应用程序.py
import os
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
app = Flask(__name__)
app.config.from_object('config.Config')
db.init_app(app)
from models import Base, Gender, ActivityLevel, KitesurfingExpertise, User, Equipment, EquipmentType, Size, WindCondition, Brand, FormEntry
with app.app_context():
db.create_all()
我的模型.py
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, Date, Float
from sqlalchemy.orm import relationship
Base = declarative_base()
class Gender(Base):
__tablename__ = 'Gender'
id = Column('GenderID', Integer, primary_key=True)
description = Column('Description', String, nullable=False)
users = relationship("User", backref="gender")
class ActivityLevel(Base):
__tablename__ = 'ActivityLevel'
id = Column('ActivityLevelID', Integer, primary_key=True)
description = Column('Description', String, nullable=False)
users = relationship("User", backref="activity_level")
class KitesurfingExpertise(Base):
__tablename__ = 'KitesurfingExpertise'
id = Column('ExpertiseID', Integer, primary_key=True)
description = Column('Description', String, nullable=False)
users = relationship("User", backref="expertise")
class User(Base):
__tablename__ = 'User'
id = Column('UserID', Integer, primary_key=True)
gender_id = Column('GenderID', Integer, ForeignKey('Gender.GenderID'))
dob = Column('DateOfBirth', Date, nullable=False)
height = Column('HeightInches', Float, nullable=False)
weight = Column('WeightLbs', Float, nullable=False)
activity_level_id = Column('ActivityLevelID', Integer, ForeignKey('ActivityLevel.ActivityLevelID'))
expertise_id = Column('ExpertiseID', Integer, ForeignKey('KitesurfingExpertise.ExpertiseID'))
# Relationship
form_entries = relationship("FormEntry", backref="user")
class Equipment(Base):
__tablename__ = 'Equipment'
id = Column('EquipmentID', Integer, primary_key=True)
description = Column('Description', String, nullable=False)
# Relationship
types = relationship("EquipmentType", back_populates="equipment")
form_entries = relationship("FormEntry", backref="equipment")
class EquipmentType(Base):
__tablename__ = 'EquipmentType'
id = Column('TypeID', Integer, primary_key=True)
equipment_id = Column('EquipmentID', Integer, ForeignKey('Equipment.EquipmentID'))
description = Column('Description', String, nullable=False)
# Relationship
equipment = relationship("Equipment", back_populates="types")
form_entries = relationship("FormEntry", backref="equipment_type")
class Size(Base):
__tablename__ = 'Size'
id = Column('SizeID', Integer, primary_key=True)
description = Column('Description', String, nullable=False)
form_entries = relationship("FormEntry", backref="size")
class WindCondition(Base):
__tablename__ = 'WindCondition'
id = Column('ConditionID', Integer, primary_key=True)
description = Column('Description', String, nullable=False)
form_entries = relationship("FormEntry", backref="wind_condition")
class Brand(Base):
__tablename__ = 'Brand'
id = Column('BrandID', Integer, primary_key=True)
description = Column('Description', String, nullable=False)
form_entries = relationship("FormEntry", backref="brand")
class FormEntry(Base):
__tablename__ = 'FormEntry'
id = Column('EntryID', Integer, primary_key=True)
user_id = Column('UserID', Integer, ForeignKey('User.UserID'))
equipment_id = Column('EquipmentID', Integer, ForeignKey('Equipment.EquipmentID'))
type_id = Column('TypeID', Integer, ForeignKey('EquipmentType.TypeID'))
size_id = Column('SizeID', Integer, ForeignKey('Size.SizeID'))
condition_id = Column('ConditionID', Integer, ForeignKey('WindCondition.ConditionID'))
brand_id = Column('BrandID', Integer, ForeignKey('Brand.BrandID'))
model = Column('Model', String, nullable=False)
# Relationships (Note: relationships for user will be defined in the user model)
equipment = relationship("Equipment")
equipment_type = relationship("EquipmentType")
size = relationship("Size")
wind_condition = relationship("WindCondition")
brand = relationship("Brand")
我的config.py:
import os
class Config:
SQLALCHEMY_DATABASE_URI = os.environ.get('JAWSDB_MARIA_URL', 'sqlite:///fallback.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
它们在项目文件夹中处于同一级别。
**
更新1
**
我已经更新了我的 models.py 以精确使用 FlaskSQLAlchemy(我希望):
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Gender(db.Model):
__tablename__ = 'gender'
id = db.Column('gender_id', db.Integer, primary_key=True)
description = db.Column('description', db.String, nullable=False)
users = db.relationship("User", backref="gender")
class ActivityLevel(db.Model):
__tablename__ = 'activity_level'
id = db.Column('activity_level_id', db.Integer, primary_key=True)
description = db.Column('description', db.String, nullable=False)
users = db.relationship("User", backref="activity_level")
class KitesurfingExpertise(db.Model):
__tablename__ = 'kitesurfing_expertise'
id = db.Column('expertise_id', db.Integer, primary_key=True)
description = db.Column('description', db.String, nullable=False)
users = db.relationship("User", backref="expertise")
class User(db.Model):
__tablename__ = 'user'
id = db.Column('user_id', db.Integer, primary_key=True)
gender_id = db.Column(db.Integer, db.ForeignKey('gender.gender_id'))
dob = db.Column('date_of_birth', db.Date, nullable=False)
height = db.Column('height_inches', db.Float, nullable=False)
weight = db.Column('weight_lbs', db.Float, nullable=False)
activity_level_id = db.Column(db.Integer, db.ForeignKey('activity_level.activity_level_id'))
expertise_id = db.Column(db.Integer, db.ForeignKey('kitesurfing_expertise.expertise_id'))
class Equipment(db.Model):
__tablename__ = 'equipment'
id = db.Column('equipment_id', db.Integer, primary_key=True)
description = db.Column('description', db.String, nullable=False)
types = db.relationship("EquipmentType", backref="equipment")
class EquipmentType(db.Model):
__tablename__ = 'equipment_type'
id = db.Column('type_id', db.Integer, primary_key=True)
equipment_id = db.Column(db.Integer, db.ForeignKey('equipment.equipment_id'))
description = db.Column('description', db.String, nullable=False)
class Size(db.Model):
__tablename__ = 'size'
id = db.Column('size_id', db.Integer, primary_key=True)
description = db.Column('description', db.String, nullable=False)
class WindCondition(db.Model):
__tablename__ = 'wind_condition'
id = db.Column('condition_id', db.Integer, primary_key=True)
description = db.Column('description', db.String, nullable=False)
class Brand(db.Model):
__tablename__ = 'brand'
id = db.Column('brand_id', db.Integer, primary_key=True)
description = db.Column('description', db.String, nullable=False)
class FormEntry(db.Model):
__tablename__ = 'form_entry'
id = db.Column('entry_id', db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.user_id'))
equipment_id = db.Column(db.Integer, db.ForeignKey('equipment.equipment_id'))
type_id = db.Column(db.Integer, db.ForeignKey('equipment_type.type_id'))
size_id = db.Column(db.Integer, db.ForeignKey('size.size_id'))
condition_id = db.Column(db.Integer, db.ForeignKey('wind_condition.condition_id'))
brand_id = db.Column(db.Integer, db.ForeignKey('brand.brand_id'))
model = db.Column('model', db.String, nullable=False)
此外,更新并测试了我的 app.py,在文件本身上定义单个示例模型时,会创建表,但在导入时(请参阅 #commented 行)不会创建表:
相关切片:
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
import os
# Criar a extensão
db = SQLAlchemy()
# Criar o app Flask
app = Flask(__name__)
# Configurar a URI do SQLite, relativo à pasta da instância do app.
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///kitedatabase.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False # Para evitar warnings
# Inicializar o app com a extensão
db.init_app(app)
# Importar os modelos após inicializar o app e a extensão db
# from models import Gender, ActivityLevel, KitesurfingExpertise, User, Equipment, EquipmentType, Size, WindCondition, Brand, FormEntry
class Gender(db.Model):
__tablename__ = 'gender'
id = db.Column('gender_id', db.Integer, primary_key=True)
description = db.Column('description', db.String, nullable=False)
users = db.relationship("User", backref="gender")
有什么想法吗?谢谢大家。
解决了删除循环引用的问题:
创建了一个setup.py:
# setup.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
db = SQLAlchemy(app)
将东西导入到models.py中:
# models.py
from setup import db
classes definitions...
将所有内容放在app.py中:
# app.py
from setup import app, db
from models import Gender, ActivityLevel, ...
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
感谢@snakecharmerb 领导混音!