Flask-SQLAlchemy创建SQLite数据库但不创建表

时间:2018-09-30 06:52:05

标签: python flask flask-sqlalchemy python-module

我看过a very similar issue,但是该解决方案不适用于我,我想知道是否可以得到一些指导。

这是我的应用程序结构:

mosiman/
  __init__.py
  blog/
    __init__.py
    blogconfig.py
    blog.py
    static/
      ...
    templates/
      ...

我真的很想一种方法来构建单独的应用程序,但可以从一个应用程序实例管理它们,这样我就不必接触WSGI层,而蓝图似乎是最好的方法。

我认为以下是相关文件:

# mosiman/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import blog.blog as blog
...
...
db = SQLAlchemy()
...
...
def create_app():
    app = Flask(__name__)
    db_path = os.path.join(os.path.dirname(__file__), 'mosiman.db')
    app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite:///{}'.format(db_path)
    app.config["SQLALCHEMY_BINDS"] = {'blog': os.path.join(os.path.dirname(__file__), 'blog/blog.db')
    db.init_app(app)
    app.register_blueprint(blog.blog, url_prefix='/blog')
    return app
if __name__ == '__main__':
    app = create_app()
    app.run(debug=True)

我的mosiman/blog/blog.py文件中也有

#mosiman/blog/blog.py
<<< all of the usual flask imports and SQLAlchemy, etc >>>
from .__init__ import db
blog = Blueprint('blog', __name__)
...
...
class Entry(db.Model):
    __bind_key__ = "blog"
    id = db.Column(db.Integer, primary_key = True)
    title = db.Column(db.String(150))
    ...
    ...

这是我的问题:我实际上没有“默认”数据库,因此没有适用的类。但是我确实想使用类Entry来初始化我的博客数据库。

initializing the database的默认过程似乎是弹出python REPL,导入数据库,然后运行db.create_all()

好吧,我不能仅导入db并运行db.create_all(),因为db尚未附加到应用程序(在create_app()中完成)我继续:

# pop open a REPL at mosiman/
>>> from __init__ import db
>>> from __init__ import create_app
>>> app = create_app()
>>> db.init_app(app)
>>> from blog.blog import Entry
>>> db.init_app(app)
# At this point, db still isn't attached to an engine?
>>> db
<SQLAlchemy engine=None>
>>> with app.app_context():
...     db.create_all()
...
>>>

现在,当我转到mosiman/blog/时,我发现已经创建了blog.db,但是当我在SQLite3中检查架构和表时,什么也没出现。

1通过将from __init__ import db更改为from mosiman import db

解决了他们的问题

如果我尝试在mosiman/内这样做:

>>> from mosiman import db
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'mosiman'

即使我那里有__init__.py

如果我从../mosiman上方的目录)运行它:

>>> from mosiman import db
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/users/d49chan/mosiman/__init__.py", line 3, in <module>
    import blog.blog as blog
ModuleNotFoundError: No module named 'blog'

我不确定如何继续。也许是因为我需要睡觉,但是我一直在试图理解为什么在过去的几个小时里没有任何反应。如果您能指出正确的方向或消除我的一些误解,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

1)您不是导入__init__.py。您应该使用其中的目录(包)的名称导入它。

2)您不应该这样导入:import blog.blog。相反,您应该:from blog import blog

3)确保每个目录中都有一个__init__.py文件,以便python导入程序将其视为可以从中导入的包(目录)。

4)相对导入和绝对导入之间是有区别的。

相对导入:

# l3_module.py in l3_package
from ..l1_package import l1_module

这将导入一个模块,该模块相对于导入模块位于两个包(目录)上方。

现在假设l3_package位于l1_module的l2_package中,您也可以这样导入

绝对导入:

# l3_moudle.py in l3_package
from l1_package import l1_module

这也可以工作,但是有时会把东西弄乱,具体取决于您的环境。 这是一个很好的答案,可以为您清除一些问题:Relative imports for the billionth time

希望有帮助:)