在导入表类定义时,无法实例化db SQLAlchemy

时间:2014-03-28 03:45:22

标签: python sqlite sqlalchemy

我正在编写一个带有不同模块的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中,则构建数据库。任何建议将不胜感激。

1 个答案:

答案 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)