【问题标题】:sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such table: itemssqlalchemy.exc.OperationalError:(sqlite3.OperationalError)没有这样的表:项目
【发布时间】:2020-05-08 12:04:39
【问题描述】:

我不明白为什么会出现此错误。请解释错误。 我用的是官方文档。

我运行 Pipenv 虚拟环境: python 3.8.2 sqlalchemy 1.3.16

您也可以尝试运行此代码。

import enum

from sqlalchemy import create_engine, Column, Integer, String, Enum
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()


class Type(str, enum.Enum):
    ONE = "one"
    TWO = "two"


class Item(Base):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, unique=True, index=True)
    type = Column(Enum(Type), default=Type.ONE, nullable=False)


item = Item(name="item_name", type="one")
session.add(item)

print(Item.__table__)
session.commit()
for name in session.query(Item.name):
    print(name)

【问题讨论】:

  • 你执行Base.metadata.create_all(bind=engine)创建表了吗?
  • @snakecharmerb 现在我添加了它并且一切正常。为什么要添加这个?
  • 它在数据库中创建表(有一些方法可以将 SQLAlchemy 与预先存在的表一起使用,因此需要明确的指令)。

标签: python python-3.x sqlalchemy


【解决方案1】:

我补充说:

engine = create_engine('sqlite:///:memory:', echo=True)
Base = declarative_base()
Base.metadata.create_all(bind=engine)
Session = sessionmaker(bind=engine)
session = Session()

它在数据库中创建表(有一些方法可以将 SQLAlchemy 与预先存在的表一起使用,因此需要明确的指令)。

【讨论】:

  • 我尝试了包括 "Base.metadata.create_all(bind=engine) 但仍然收到错误:第 717 行,在 do_execute cursor.execute(statement, parameters) sqlalchemy.exc 中。 OperationalError: (sqlite3.OperationalError) no such table: items [SQL: INSERT INTO items (name, type) VALUES (?, ?)] [parameters: ('item_name', 'ONE')] (此错误的背景: sqlalche.me/e/14/e3q8)
  • 我想通了....我必须在第一个打印语句之前移动该语句:Base.metadata.create_all(bind=engine)
【解决方案2】:

万一它最终帮助了某人,我的问题是由于使用内存中的 sqlite db 来对 API 进行单元测试。 Pytest 将使用一个连接设置数据库和表,而 API 将在测试到达端点时创建自己的单独连接。这最终为我解决了这个问题。

engine = create_engine("sqlite:///:memory:", poolclass=StaticPool, connect_args={'check_same_thread': False})

参考:https://docs.sqlalchemy.org/en/14/dialects/sqlite.html#using-a-memory-database-in-multiple-threads

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 2017-12-10
    • 2020-09-16
    • 2020-12-01
    • 2021-01-12
    • 2021-11-02
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多