我正在编写一个带有不同模块的SQLAlchemy python sqlite应用程序,用于定义模式,实例化数据库以及从解析CSV文件添加记录。我可以让数据库用任何表实例化的唯一方法是在与我的Base.metadata.create_all()调用相同的模块中创建表类。我在网上看过一些例子,在一个单独的模块中有一个db_init函数,它导入表类然后生成数据库结构,但对我来说,我得到一个完全空的数据库。
我宁愿这样做,所以我可以将model.py重用于导入数据的模块。我发现的例子似乎来自Flask,但这不是Flask应用程序。我直接使用sqlalchemy。
我的models.py(只有一个类)的一个例子:
from sqlalchemy import Column, Integer, Date, Text, String, Boolean, ForeignKey
from sqlalchemy.orm import relationship
from db2 import Base
class Area(Base):
__tablename__ = 'areas'
id = Column(Integer, primary_key=True)
name = Column(String(64), unique=True)
和db2.py:
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
import os
Base = declarative_base()
def db_create(conn_string):
engine = create_engine(conn_string)
from models import Area, Audit, CardsPerArea, Issue, Pareto
Base.metadata.create_all(engine)
但这给了我一个空的数据库。如果我将models.py的所有内容移动到db2.py中,则构建数据库。任何建议将不胜感激。
答案 0 :(得分:0)
我认为您的问题是由代码中的循环导入引起的。这可以通过将对declarative_base()
的调用从db2.py移动到models.py。
models.py
from sqlalchemy import Column, Integer, Date, Text, String, Boolean, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Area(Base):
__tablename__ = 'areas'
id = Column(Integer, primary_key=True)
name = Column(String(64), unique=True)
db2.py
from sqlalchemy import create_engine
import os
import models
def db_create(conn_string):
engine = create_engine(conn_string)
models.Base.metadata.create_all(engine)