Создание схемы с помощью декларативного сопоставления: Base.metadata.create_all (engine) не работает - PullRequest
0 голосов
/ 29 мая 2019

Вот абсурдная проблема с sqlalchemy, которая кажется простой!Во-первых, это мой конфигурационный файл для подключения к базе данных :

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
engine = create_engine('mysql://root:@localhost:3306/digi')

, а затем я пытаюсь создать таблицу с именем 'sale-history':

from config import *
from sqlalchemy import *

class Sale(Base):
    __tablename__ = 'sale-history'
    order_id = column(Integer, primary_key= True)
    customer_id = column(Integer)
    item_id = column(Integer)       #froeign key with product list
    cartFinalize_dateTime = column(DATETIME)
    amount_ordrered = column(Integer)
    city_name = column(String(191))
    quantity_ordered = column(Integer)

    def __repr__(self):
        return "<Sale(city_name='%s')>" % (self.city_name)

Sale.__table__
Base.metadata.create_all(engine)

Теперь мне интересно, что

Sale.__table__

и

Base.metadata.create_all(engine)

не известны моему коду.Точнее, это не те варианты предложений, которые показывает редактор pycharm.Отладка кода не выдает никакой ошибки (возвращает 0).Что я должен сделать, чтобы создать таблицы?Я очень ценю ваше внимание!

1 Ответ

0 голосов
/ 30 мая 2019

Код использует column для определения столбцов в таблице, но он должен использовать Column (обратите внимание на прописную букву "C").

Несколько советов / комментариев

  • Pycharm может оказать лучшую поддержку, если вы избегаете идиомы from module import *.Вы можете использовать псевдонимы модулей, если они слишком длинные для ввода, например import sqlalchemy as sa
  • . Вы можете увидеть SQL, сгенерированный механизмом, передав echo=True в create_engine
  • Имена таблиц с помощьюдефисы должны быть заключены в кавычки, чтобы быть действительными.Sqlalchemy делает это автоматически, но другие приложения не могут.Вместо этого может быть удобнее использовать подчеркивание.

Окончательный код может выглядеть следующим образом:

config

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
engine = create_engine('mysql://root:@localhost:3306/test', echo=True)

Модель

import sqlachemy as sa
import config


class Sale(Base): 
    __tablename__ = 'sale-history'
    order_id = sa.Column(sa.Integer, primary_key=True)
    customer_id = sa.Column(sa.Integer)   
    item_id = sa.Column(sa.Integer)       # foreign key with product list
    cartFinalize_dateTime = sa.Column(sa.DATETIME)
    amount_ordrered = sa.Column(sa.Integer)
    city_name = sa.Column(sa.String(191))
    quantity_ordered = sa.Column(sa.Integer)

    def __repr__(self):
        return "<Sale(city_name='%s')>" % (self.city_name)


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