Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 28, 2021 19:23:23

skoomer
Зарегистрирован: 2015-01-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Python implement OneToOneField & ForeignKey

Доброго времени суток.
Стоит задача потренироваться Python + sql
Хочу попробовать сделать минимальное подобие orm.
Начал с написания классов типов полей и отношений.
Есть классы Field, CharField etc..

у меня возникли трудности с их реализацией.

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

вот пару примеров того что я сделал.

Я не знаю насколько это неправильно и не пойму как реализовать отношения ForeignKey and OneToOneField
валидации пока не делаю.
Подскажите что не правильно, что дописать а что убрать.особенно важен момент с отношениями

дальше буду через форматирование строк в sql вставлять значения и делать таблицы,строки.
пока все работает кроме отношений

 class Field(object):
    def __init__(self, name, column_type, primary_key, default):
        self.name = name
        self.column_type = column_type
        self.primary_key = primary_key
        self.default = default
    def __str__(self):
        return '<%s, %s, %s>' % (self.__class__.__name__, self.column_type, self.name)
class VarcharField(Field):
    def __init__(self,  name=None, primary_key=False, default=None, ddl='varchar(100)', max_len=4):
        super(VarcharField, self).__init__(name, ddl, primary_key, default)
        self.max_len = max_len
        self.field_type_sql = f'VARCHAR'
class OneToOneField(Field):
    def __init__(self, rel_class, name=None):
        super(OneToOneField, self).__init__(
            name, primary_key=False, default=0, column_type=None
        )
        self.rel_class = rel_class
class ForeignKey(Field):
    def __init__(self, model_class, name=None):
        self.column_type = "foreignkey"
        self.field_level = 1
        self.name = name
        self.model_class = model_class
    def field_sql(self, field_name):
        foreign_to = self.model_class.__name__.lower()
        return '"%s" integer NULL REFERENCES "%s" ("id")' % (field_name, foreign_to)

Отредактировано skoomer (Сен. 28, 2021 19:25:34)

Офлайн

#2 Сен. 29, 2021 10:39:05

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Python implement OneToOneField & ForeignKey

skoomer
у меня возникли трудности с их реализацией.
из вашего кода совершенно невозможно понять, какие именно трудности и с чем

skoomer
Я не знаю насколько это неправильно
Мне кажется, вы не с того начали. У вас же не вполне прикладная задача, где есть условие и результат, вы разрабатываете фреймворк. То есть ваш код будет многократно переиспользоваться и задача сделать это переиспользование максимально практичным. Вот с этого и надо начать. Надо сначала придумать как это будет использоваться, безо всякой реализации. Встаньте на сторону пользователя вашего фреймворка, накидайте примеров, как будут выглядеть модели, как будут строиться запросы, как извлекаться данные, как сущности будут обновляться, создаваться и удаляться, как работать с транзакциями и пр. А потом, имея представление о том, что надо реализовать, можно приступать к реализации.

Например, я придумал вот такой фреймворк
 @model(models.ID_MODEL)
class Person:
    @field(fields.STRING, empty=True)
    def name(self, val: str) -> str:
          pass   
    @field(fields.INT, null=False)
    def age(self, val: int) -> int:
          assert(10 < val < 150)
@model(models.ID_MODEL)
class Organization:
    @field(fields.STRING, empty=False, unique=True)
    def name(self, val: str) ->str:
          pass  
    
    @field(fields.ONE_TO_MANY, rely_to=Person) 
    def staff(self, val: Iterable[Person]) -> List[Person]:
         pass
with transaction() as t:
    person = new(Person)
    person.name = 'Ivan'
    person.age = 43
    organization = find_one(Organization).where(name='Vector')
    organization.staff.add(person)

теперь можно пробовать реализовать задумку. А что вы пытаетесь воплотить в коде?



Отредактировано FishHook (Сен. 29, 2021 10:41:30)

Офлайн

#3 Сен. 29, 2021 17:09:32

skoomer
Зарегистрирован: 2015-01-24
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Python implement OneToOneField & ForeignKey

FishHook
Мне кажется, вы не с того начали. У вас же не вполне прикладная задача, где есть условие и результат, вы разрабатываете фреймворк. То есть ваш код будет многократно переиспользоваться и задача сделать это переиспользование максимально практичным. Вот с этого и надо начать. Надо сначала придумать как это будет использоваться, безо всякой реализации. Встаньте на сторону пользователя вашего фреймворка, накидайте примеров, как будут выглядеть модели, как будут строиться запросы, как извлекаться данные, как сущности будут обновляться, создаваться и удаляться, как работать с транзакциями и пр. А потом, имея представление о том, что надо реализовать, можно приступать к реализации.

Конкретно сейчас хочу узнать как написать классы - один к одному и один ко многим FK & onetoone

Надо сначала придумать как это будет использоваться, безо всякой реализации. Встаньте на сторону пользователя вашего фреймворка, накидайте примеров, как будут выглядеть модели, как будут строиться запросы, как извлекаться данные, как сущности будут обновляться, создаваться и удаляться, как работать с транзакциями и пр.

это будет использоваться только в учебных целях .Насчет запросов и транзакций , буду использовать адаптер psycopg2 , функции для создание таблиц , или просто вручную писать sql и через форматирование строк вставлять значения.

Пока что меня волнует как должны выглядеть базовые классы которые описывают тип полей.
FK & onetoone с этим затрудняюсь

Офлайн

#4 Сен. 29, 2021 18:24:36

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Python implement OneToOneField & ForeignKey

Да как угодно они могут выглядеть, нет же никакого стандарта.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version