【问题标题】:Access db from a separate file flask SQLAlchemy python3从单独的文件烧瓶 SQLAlchemy python3 访问 db
【发布时间】:2019-11-04 20:45:05
【问题描述】:

我正在编写一个烧瓶应用程序。我有两个文件。 main.py 和数据库.py。我想从 database.py 文件创建一个数据库。 main.py 应该访问 databases.py 文件并创建名为“Users”的数据库和表。但它显示导入错误。帮我解决这个问题

main.py

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from databases import User

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/data_log.db'
db = SQLAlchemy(app)

if __name__ == '__main__':
    db.create_all()
    app.run(host='0.0.0.0', port=5001)  

数据库.py

from main import db
from passlib.apps import custom_app_context as pwd_context

class User(db.Model) :
    __tablename__ = 'users'
    user_id     =   db.Column(db.Integer, primary_key = True)
    username    =   db.Column(db.String(32), index = True)
    password    =   db.Column(db.String(128))
    def hash_password(self, password) :
        self.password =pwd_context.hash(password)
    def verify_password(self, password) :
        return pwd_context.verify(password, self.password)

追溯:

Traceback (most recent call last):
  File "main.py", line 3, in <module>
    from databases import User
  File "/home/paulsteven/stack/databases.py", line 1, in <module>
    from main import db
  File "/home/paulsteven/stack/main.py", line 3, in <module>
    from databases import User
ImportError: cannot import name 'User'

【问题讨论】:

    标签: python python-3.x sqlite flask flask-sqlalchemy


    【解决方案1】:

    这是循环导入冲突的常见情况。 回溯给你一个清晰的步骤:

    如何分步进行:

    • 你跑main.py
    • 控制流开始导入功能/库,直到它获得第 3 行 from databases import User
    • 它转到databases 模块以找到所需的User 类。但是...User 可能会使用外部范围功能(它确实需要db.Model),因此控制流需要从一开始就扫描databases 模块。这反映了追溯的第二步 ("/home/paulsteven/stack/databases.py", line 1)
    • 从上一步的位置到database.py,控制流遇到from main import db - 这意味着它应该返回main(main.py) 模块!
    • 返回到main 模块的控制流从第一行再次开始扫描 - 直到找到from databases import User 再次。这反映了回溯的第三步 (File "/home/paulsteven/stack/main.py", line 3)
      • 然后你就会陷入循环......

    解决问题的正确方法是什么?
    将所有数据库上下文/数据库模型保存在单独的模块中。
    遵循对象关系的顺序以及它们如何相互依赖:

    ---> 应用程序首先实例化 (app)

    • --->然后根据app创建数据库框架实例db = SQLAlchemy(app)

      • ---> 然后根据db 实例创建自定义数据库模型(如User(db.Model)

    main.py

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    # from databases import User  <--- shouldn't be here
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/data_log.db'
    db = SQLAlchemy(app)
    
    if __name__ == '__main__':
        from databases import User  #  after instantiating `db` import model(s) 
        db.create_all()
        app.run(host='0.0.0.0', port=5001)  
    

    【讨论】:

    • 如何使用databases.py文件中的User类在db中创建表??
    • @PaulSteven,查看更新。实例化后使用模型db
    • 现在类已成功导入。尽管尚未创建表。
    • @PaulSteven,在db.create_all()之后添加db.session.commit()
    • db.create_all() 之后添加db.session.commit() 后也没有创建表。它只创建一个文件。
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 2012-12-29
    • 2021-01-24
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-09
    • 2014-07-20
    相关资源
    最近更新 更多