Превратить класс sqlalchemy в Python в необработанный SQL (создать таблицу с внешним ключом) - PullRequest
0 голосов
/ 28 мая 2018

У меня есть приложение на Python, и я использую sqlalchemy и posgreSQL.У меня уже есть некоторые данные в БД, и я не хочу их воссоздавать, поэтому я хочу добавить таблицу в БД и сохранить все данные (ранее я для этого использовал alembic, но на этот раз я хочу использовать сырой SQL).

Это моя новая таблица, которую я хочу добавить в БД на python:

# User payed data
class UserPayData(Base):
    __tablename__ = 'userspaydata'
    id = Column(Integer, primary_key=True) 
    account_owner = Column(Text, nullable=False)
    IBAN = Column(Text, nullable=False)
    # Foreign Keys
    belongs_to_user_id = Column(Integer, ForeignKey('users.id'))
    payment_belongs_to_user_relation = relationship("User", back_populates="payment_belongs_to_user_addresses")

    def __init__(self, account_owner=None, IBAN=None):
        self.account_owner = account_owner
        self.IBAN = IBAN

    def get(self, id):
        if self.id == id:
            return self
        else:
            return None

    def __repr__(self):
        return '<%s(%r, %r, %r)>' % (self.__class__.__name__, self.id, self.account_owner, self.IBAN)

Вот соответствующая часть из таблицы users:

# Project
class User(UserMixin, Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    # etc...
    # Foreign Key payment
    payment_belongs_to_user_addresses = relationship('UserPayData', back_populates="payment_belongs_to_user_relation")

Это необработанный SQL, который я хочу выполнить:

CREATE TABLE 'userspaydata'
(
    account_owner TEXT NOT NULL,
    IBAN TEXT NOT NULL,
    belongs_to_user_id INT references users(id)
);

Я нашел много примеров, и некоторые из них отличаются.

У меня есть несколько вопросов:

Нужно ли создавать первичный ключ?AFAIK, если первичный ключ не определен мной, он будет автоматически ID INT

Отношения не нужно определять на уровне БД, они определяются на уровне приложения, или я ошибаюсь?Если я ошибаюсь, как определить отношение в сыром SQL?

Я еще не отправил запрос SQL, правильный ли синтаксис?

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Это мое решение, и оно работает (я также добавил дату и время):

CREATE TABLE userspaydata (
    Id SERIAL primary key,
    account_owner TEXT NOT NULL,
    IBAN TEXT NOT NULL,
    date_added TIMESTAMP WITH TIME ZONE,
    belongs_to_user_id INT references users(id)
);

PK должен быть определен мной.

Отношения обрабатываются на уровне приложения.

0 голосов
/ 28 мая 2018

Нужно ли создавать первичный ключ, а также

Да, если вы хотите работать с таблицами с помощью декларативных сопоставлений sqlalchemy, и в целом это хорошая идея указать первичныйkey.

Не требуется определять отношения на уровне БД, они определяются на уровне приложения или я ошибаюсь?

Внешние ключи определены в вашей SqlalchemyДекларативные классы сопоставляются с ограничениями внешнего ключа базы данных.

Опять же, отношения в реляционных базах данных - еще одна отличная идея.Укажите зависимости внешнего ключа, если у вас нет особых причин не делать этого.

Если вы не укажете ограничения в базе данных, вы можете получить поврежденные данные.

Если вы генерируете операторы DDL вручную, вы можете указать ограничения внешнего ключа. Иностранные ключи в документации Postgres

Я еще не отправил запрос SQL, правильный ли синтаксис?

Нет, вот исправленная версиявашего оператора DDL.

CREATE TABLE userspaydata (
  id INTEGER PRIMARY KEY,
  account_owner TEXT NOT NULL,
  IBAN TEXT NOT NULL,
  belongs_to_user_id INT references users(id) -- this is a FK constraint
);

Обратите внимание, что id не увеличивает автоматически.Для auto-increment id

измените определение столбца id на

-- postgrseql 10 & above
id INTEGER PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY
-- postgresql 9.6 & below
id SERIAL PRIMARY KEY

и измените отображение sqlalchemy для столбца id на

id = Column(Integer, primary_key=True, auto_increment=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...