从单独的文件SQLAlchemy python3访问数据库
我正在写一份申请书。我有两个文件。main.py和databases.py。我想从database.py文件创建一个数据库。main.py应该访问databases.py文件并创建名为“Users”的数据库和表。但它显示了导入错误。帮我解决这个问题 main.py从单独的文件SQLAlchemy python3访问数据库,python,python-3.x,sqlite,flask,flask-sqlalchemy,Python,Python 3.x,Sqlite,Flask,Flask Sqlalchemy,我正在写一份申请书。我有两个文件。main.py和databases.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
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'
回溯(最近一次呼叫最后一次):
文件“main.py”,第3行,在
从数据库导入用户
文件“/home/paulsteven/stack/databases.py”,第1行,在
从主导入数据库
文件“/home/paulsteven/stack/main.py”,第3行,在
从数据库导入用户
ImportError:无法导入名称“User”
这是循环导入冲突的常见情况。
回溯为您提供了清晰的步骤:
它是如何分步骤进行的:
- 运行
main.py
- 控制流开始导入功能部件/库,直到获得第3行
从数据库导入用户
- 它转到
模块以查找所需的数据库
类。但是用户
可以使用外部范围功能(并且它确实需要用户
),因此控制流需要从一开始就扫描db.Model
模块。这反映了回溯的第二步(数据库
)“/home/paulsteven/stack/databases.py”,第1行
- 从上一步位于
的位置开始,控制流遇到来自主导入db的database.py
,,这意味着它应该返回到
(main
)模块强>main.py
- 返回到
模块的控制流再次从第1行开始扫描,直到从数据库中找到主
。这反映了回溯的第三步(,再次导入用户
文件/home/paulsteven/stack/main.py),第3行
- 然后你进入了一个循环
解决问题的正确方法是什么?
将所有数据库上下文/DB模型保存在单独的模块中。
遵循对象关系的顺序以及它们如何相互依赖: --->首先实例化应用程序(
app
)
- --->然后根据
DB=SQLAlchemy(app)创建DB框架实例app
- --->然后根据
实例创建自定义数据库模型(如DB
)User(DB.Model)
- --->然后根据
main.py
从烧瓶导入烧瓶
从flask_sqlalchemy导入sqlalchemy
#从databases导入用户如何使用databases.py文件中的用户类在db中创建表???@PaulSteven,请参阅更新。实例化db
后使用模型现在类已成功导入。即使尚未创建表。@PaulSteven,在db.create\u all()
之后添加db.session.commit()
即使在db.create\u all()之后添加db.session.commit()
也不会创建表。它只创建一个文件。
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)