我试图像教程中那样设置数据库,但是遇到编程错误,即当我尝试添加User
时表不存在
这是错误的文件(database.py
):
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine(
"mysql+pymysql://testuser:testpassword@localhost/test?charset=utf8",
connect_args = {
"port": 3306
},
echo="debug",
echo_pool=True
)
db_session = scoped_session(
sessionmaker(
bind=engine,
autocommit=False,
autoflush=False
)
)
Base = declarative_base()
def init_db():
import models
Base.metadata.create_all(bind=engine)
from models import User
db_session.add(
User(username="testuser", password_hash=b"", password_salt=b"", balance=1)
)
db_session.commit()
print("Initialized the db")
if __name__ == "__main__":
init_db()
要初始化数据库(创建表),我只运行文件。 创建测试用户时出错。
这里是models.py
:
from sqlalchemy import Column, Integer, Numeric, Binary, String
from sqlalchemy.orm import relationship
from database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
username = Column(String(16), unique=True)
password_hash = Column(Binary(32))
password_salt = Column(Binary(32))
balance = Column(Numeric(precision=65, scale=8))
def __repr__(self):
return "<User(balance={})>".format(balance)
我尝试过:
create_all
之后)from models import User
代替import models
(在create_all
之前)很抱歉,如果有这么多类似的问题,我保证我会尽力寻找答案,但这始终是我确保自己没有犯的错误(或者至少没有看到的错误)。
我正在使用MariaDB。
对不起,很长的帖子,非常感谢。
答案 0 :(得分:0)
Base
中的database.py
与导入到Base
中的models.py
不同。
一个简单的测试是在print('creating Base')
语句的上方放置一个Base = declarative_base()
函数调用,您会看到它被创建了两次。
Python调用正在执行的模块'__main__'
,因为您在模块底部具有if __name__ == '__main__'
条件,所以您会知道。因此,创建的第一个Base
是__main__.Base
。然后,在models.py
中,from database import Base
导致database
模块被再次解析,在命名空间中创建database.Base
,这就是{{ 1}}继承。然后回到Base
,User
调用正在使用database.py
中的元数据,其中没有表,因此什么也不创建。
不要在创建Base.metadata.create_all(bind=engine)
实例的模块之外执行。创建另一个名为__main__.Base
(或任何其他名称)的模块,然后在其中移动Base
函数,并将main.py
中的init_db()
,Base
和db_session
导入engine
。这样,您将始终使用相同的database.py
实例。这是main.py
的示例:
Base
答案 1 :(得分:0)