Таблица ошибок SQLAlchemy не найдена - PullRequest
0 голосов
/ 26 июня 2018

Я новичок в использовании sqlAlchemy, и я продолжаю получать эту ошибку, когда я пытаюсь вставить запись данных. Пожалуйста, скажите мне, что я делаю не так.

test.py код:

import sys
import sqlalchemy
from sqlalchemy.orm import sessionmaker
from sqlalchemy import Column,ForeignKey,Integer,String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from sqlalchemy import create_engine


engine = create_engine('sqlite:///restaurantmenu.db')
Base = declarative_base()


class Restaurant(Base):
   __tablename__ = "restaurant"
    name = Column(String(80),nullable=False)
    id = Column(Integer,primary_key=True)


class MenuItem(Base):
    __tablename__ = 'menu_item'
    name = Column(String(80),nullable=False)
    id = Column(Integer,primary_key = True)
    course = Column(String(250))
    description = Column(String(250))
    price = Column(String(9))
    restaurant_id = Column(Integer,ForeignKey('restaurant.id'))
    restaurant = relationship(Restaurant)
Base.metadata.create_all(engine)

код accessDatabase.py

import sys
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from test import Base,Restaurant,MenuItem

engine = create_engine('sqlite:///restaurantmenu.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine,autoflush=False)
session = DBSession()
MyFirstRestaurant = Restaurant(name = "Pizza Palace")
session.add(MyFirstRestaurant)
session.commit()
session.query(Restaurant).all()

проблема возникает, когда я запускаю accessDatabase.py и в строке session.commit

ошибка здесь:

   sqlalchemy.exc.OperationalError: 
    (raised as a result of Query-invoked autoflush; consider using a session.no_autoflush block 
if this flush is occurring prematurely) 
(sqlite3.OperationalError) no such table: restaurant [SQL: 'INSERT INTO restaurant (name) VALUES (?)'] [parameters: ('Pizza Palace',)] 
(Background on this error at: http://sqlalche.me/e/e3q8)

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Это все глупая ошибка. Инициализация двигателя перед созданием таблицы была виновником. После того, как я сдвинул эти две строки кода внизу файла. Наконец-то побежал. Движок и настройка метаданных должны выполняться после создания таблиц.

0 голосов
/ 26 июня 2018

Пожалуйста, запустите код test.py один раз, чтобы создать схему базы данных со всеми таблицами и метаданными а затем перейдите к запуску кода accessDatabase.py Я получил следующий результат, когда сделал это

> C:\Users\userX\PycharmProjects\PegabaseFilter\venv\Scripts\python.exe
> C:/Users/userX/PycharmProjects/PegabaseFilter/test_2.py
> [<test.Restaurant object at 0x00000000032A8F28>, <test.Restaurant
> object at 0x00000000032A8A90>, <test.Restaurant object at
> 0x00000000032DF048>, <test.Restaurant object at 0x00000000032DF0B8>,
> <test.Restaurant object at 0x00000000032DF160>, <test.Restaurant
> object at 0x00000000032DF208>, <test.Restaurant object at
> 0x0000000003251BA8>] {'_sa_instance_state':
> <sqlalchemy.orm.state.InstanceState object at 0x00000000032A8FD0>,
> 'name': u'Pizza Palace', 'id': 1} {'_sa_instance_state':
> <sqlalchemy.orm.state.InstanceState object at 0x00000000032A8A90>,
> 'name': u'Pizza Palace', 'id': 2} {'_sa_instance_state':
> <sqlalchemy.orm.state.InstanceState object at 0x00000000032A8C88>,
> 'name': u'Pizza Palace', 'id': 3} {'_sa_instance_state':
> <sqlalchemy.orm.state.InstanceState object at 0x00000000032A85C0>,
> 'name': u'Pizza Palace_userX', 'id': 4} {'_sa_instance_state':
> <sqlalchemy.orm.state.InstanceState object at 0x00000000032A8588>,
> 'name': u'Pizza Palace_userX', 'id': 5} {'_sa_instance_state':
> <sqlalchemy.orm.state.InstanceState object at 0x00000000032A84A8>,
> 'name': u'Pizza Palace_userX', 'id': 6} {'_sa_instance_state':
> <sqlalchemy.orm.state.InstanceState object at 0x0000000003251C18>,
> 'name': u'Pizza Palace_userX', 'id': 7}

Base.metadata.create_all (engine) это создаст не только схему, но и все объекты, отношения, атрибуты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...