sqlalchemy 搜索我的表兩次。
找了一天的問題,沒找到
應用程式/書籍/模型
print('before')
class Book(Base):
__tablename__ = 'books'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False,unique=True)
descriptions = Column(String)
file_path = Column(String,unique=True)
users = relationship("User", secondary="book_users", back_populates='books')
book_users = Table('book_users', Base.metadata,
Column('book_id', ForeignKey('books.id'), primary_key=True),
Column('users_id', ForeignKey('users.id'), primary_key=True),
)
print('after')
class Part(Base):
__tablename__ = 'parts'
id = Column(Integer, primary_key=True)
title = Column(String, nullable=False)
descriptions = Column(String)
book_id = Column('book_id',ForeignKey('books.id'))
book = relationship('Book',backref='parts')
應用程式/用戶/模型
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, index=True)
username = Column(String, unique=True)
last_name = Column(String)
hashed_password = Column(String)
books = relationship("Book", secondary="book_users", back_populates='users')
應用程式/資料庫
from decouple import config
USER = config('user')
PASSWORD = config('password')
DB = config('db')
HOST = config('host')
SQLALCHEMY_DATABASE_URL = f"postgresql://{USER}:{PASSWORD}@{HOST}/{DB}"
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
def get_db():
db = Session(bind=engine)
try:
yield db
finally:
db.close()
我試過沒有解耦,它沒有幫助
應用程式/主要
import sys,os
sys.path.insert(0, os.path.abspath(".."))
sys.path.insert(0, os.path.abspath("..."))
from fastapi import FastAPI
from database import engine, Base
from users.routers import router as router_user
from books.routers import router as router_book
def create_db():
Base.metadata.create_all(bind=engine)
app = FastAPI(title="Shop")
@app.on_event("startup")
def on_startup():
create_db()
app.include_router(router=router_user)
app.include_router(router=router_book)
插入只是我匯入的一種方式)
例外
before
after
before
Process SpawnProcess-4:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/uvicorn/subprocess.py", line 76, in subprocess_started
target(sockets=sockets)
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/uvicorn/server.py", line 60, in run
return asyncio.run(self.serve(sockets=sockets))
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/runners.py", line 44, in run
return loop.run_until_complete(main)
File "uvloop/loop.pyx", line 1501, in uvloop.loop.Loop.run_until_complete
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/uvicorn/server.py", line 67, in serve
config.load()
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/uvicorn/config.py", line 458, in load
self.loaded_app = import_from_string(self.app)
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/uvicorn/importer.py", line 21, in import_from_string
module = importlib.import_module(module_str)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/Users/kana/Desktop/author/apps/./main.py", line 9, in <module>
from books.routers import router as router_book
File "/Users/kana/Desktop/author/apps/./books/routers.py", line 13, in <module>
from .models import Book, Part
File "/Users/kana/Desktop/author/apps/./books/models.py", line 9, in <module>
class Book(Base):
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/sqlalchemy/orm/decl_api.py", line 72, in __init__
_as_declarative(reg, cls, dict_)
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/sqlalchemy/orm/decl_base.py", line 126, in _as_declarative
return _MapperConfig.setup_mapping(registry, cls, dict_, None, {})
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/sqlalchemy/orm/decl_base.py", line 177, in setup_mapping
return cfg_cls(registry, cls_, dict_, table, mapper_kw)
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/sqlalchemy/orm/decl_base.py", line 322, in __init__
self._setup_table(table)
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/sqlalchemy/orm/decl_base.py", line 811, in _setup_table
table_cls(
File "<string>", line 2, in __new__
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/sqlalchemy/util/deprecations.py", line 309, in warned
return fn(*args, **kwargs)
File "/Users/kana/Desktop/author/env/lib/python3.10/site-packages/sqlalchemy/sql/schema.py", line 584, in __new__
raise exc.InvalidRequestError(
sqlalchemy.exc.InvalidRequestError: Table 'books' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.
你怎么看,我的程式在應用程式/書籍/模型中被破壞了
課本(基礎)
如果我切換 Book 和 Part,錯誤將在 Part
任何提示將不勝感激
uj5u.com熱心網友回復:
如果遇到此問題,則需要徹底更改程式中的每個匯入,指定從根目錄開始的相同路徑。
問題的另一個原因可能是專案的架構。
我的資料庫沒有創建表的第一個原因是因為它與表處于同一級別。在我的情況下,當表處于應用程式/書籍/模型級別時,它位于應用程式/實用程式/main 中 ,他將其添加到 Base.metadata.tables,但是當他移動到應用程式/實用程式/main時,Base.metadata。表格串列為空。當我把它拉到當前水平時,問題就消失了
恢復:
string Base.metadata.create_all(bind=engine)必須高于模塊模型(或模型的另一個名稱)
并更新您的進口
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/444792.html
