Python / Flask / SQLAlchemy - 未创建表

问题描述 投票:0回答:1

我是编程新手,刚刚完成了一些课程和课程,现在正在部署我的第一个应用程序。

我正在使用 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")

有什么想法吗?谢谢大家。

python visual-studio-code flask flask-sqlalchemy
1个回答
0
投票

解决了删除循环引用的问题:

创建了一个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 领导混音!

© www.soinside.com 2019 - 2024. All rights reserved.