Форум сайта python.su
0
Доброго времени суток.
Стоит задача потренироваться 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)
Офлайн
568
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)
Офлайн
0
FishHook
Мне кажется, вы не с того начали. У вас же не вполне прикладная задача, где есть условие и результат, вы разрабатываете фреймворк. То есть ваш код будет многократно переиспользоваться и задача сделать это переиспользование максимально практичным. Вот с этого и надо начать. Надо сначала придумать как это будет использоваться, безо всякой реализации. Встаньте на сторону пользователя вашего фреймворка, накидайте примеров, как будут выглядеть модели, как будут строиться запросы, как извлекаться данные, как сущности будут обновляться, создаваться и удаляться, как работать с транзакциями и пр. А потом, имея представление о том, что надо реализовать, можно приступать к реализации.
Офлайн
568
Да как угодно они могут выглядеть, нет же никакого стандарта.
Офлайн