{"id":15156343,"url":"https://github.com/dori-dev/my-orm","last_synced_at":"2025-07-08T03:39:43.873Z","repository":{"id":58282260,"uuid":"530599658","full_name":"dori-dev/my-orm","owner":"dori-dev","description":"Simple ORM created with python and sqlite.","archived":false,"fork":false,"pushed_at":"2022-08-31T06:30:44.000Z","size":36,"stargazers_count":17,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-29T23:23:10.707Z","etag":null,"topics":["database","orm","orm-framework","package","python","python-package","sql","sqlite"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/dori-orm/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dori-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-08-30T10:09:13.000Z","updated_at":"2024-09-19T18:33:46.000Z","dependencies_parsed_at":"2022-09-01T10:11:48.907Z","dependency_job_id":null,"html_url":"https://github.com/dori-dev/my-orm","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dori-dev%2Fmy-orm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dori-dev%2Fmy-orm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dori-dev%2Fmy-orm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dori-dev%2Fmy-orm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dori-dev","download_url":"https://codeload.github.com/dori-dev/my-orm/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237973311,"owners_count":19395835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","orm","orm-framework","package","python","python-package","sql","sqlite"],"created_at":"2024-09-26T19:04:08.335Z","updated_at":"2025-02-09T15:32:57.061Z","avatar_url":"https://github.com/dori-dev.png","language":"Python","readme":"# My ORM\n\nIt's a simple ORM built with Python and sqlite.\u003cbr\u003eThis is not a real ORM to use in your project.\n\n#\n\n# Use My ORM\n\nYou can see sample codes in [examples.py](examples.py).\u003cbr\u003e\nI will be glad if you cooperate in the development of this project 😊\n\n#\n\n## Install My ORM\n\n```\npip install dori-orm\n```\n\n#\n\n## Imports\n\nImport DB, ResultConfig, operators and columns from the _dori-orm_ library.\n\u003cbr\u003e\n**DB**: For create classes and database table.\u003cbr\u003e\n**ResultConfig**: Change the result, e.g. ordering and limit.\u003cbr\u003e\n**operators**: SQL operators like AND, OR, NOT\u003cbr\u003e\n**columns**: To create table columns with specific _data type_ and _constraints_. For example `age = columns.Integer(nullable=False)` means `age INTEGER NOT NULL`\n\n```python\nfrom dori_orm import DB, ResultConfig\nfrom dori_orm.operators import AND, OR, NOT\nfrom dori_orm import columns\n```\n\n#\n\n## Create Table\n\nCreate class and inheritance from `DB`, tables created automatically in database(set db name with file name) when you inheritance from DB, you can define class variable and use `columns` to create table column.\n\n```python\nclass Person(DB):\n    name = columns.Text(nullable=False)\n    family = columns.Text(nullable=False)\n    age = columns.Integer()\n    phone = columns.Integer()\n    salary = columns.Real(default=100_000)\n\n\nclass School(DB):\n    name = columns.VarChar(nullable=False, unique=True)\n    created_at = columns.Date()\n    address = columns.Text()\n    students_count = columns.SmallInt(default=300)\n\n\nclass Student(DB):\n    person = columns.ForeignKey(Person)\n    school = columns.ForeignKey(School)\n    class_name = columns.VarChar()\n```\n\n#\n\n## Insert Data\n\nInsert data to table with create instance from class. this code create two row in database with this arguments.\n\n```python\nperson1 = Person(\n    name='Mohammad',\n    family='Dori',\n    age=20,\n    phone=1234567890,\n    salary=110_000,\n)\nprint(person1.age)  # 20\n\nperson2 = Person(\n    name='John',\n    family='Gits',\n    age=30,\n    phone=1234567890,\n)\n```\n\n#\n\n## Select Data\n\nSelect rows from table.\u003cbr\u003e\n`all` method select all rows from table.\u003cbr\u003e\n`get` method, select all rows with defined columns.\n`filter` method select all rows that match the given conditions.\n\n```python\nprint(Person.all())\n```\n\n```python\n# Result:\n[\n    \u003c'id':1, 'name':'Mohammad', 'family':'Dori', 'age':20, 'phone':1234567890, 'salary':110000.0\u003e,\n    \u003c'id':2, 'name':'John', 'family':'Gits', 'age':30, 'phone':1234567890, 'salary':100000.0\u003e\n]\n```\n\n```python\nprint(Person.get('id', 'name', 'family'))\n```\n\n```python\n# Result:\n[\n    \u003c'id':1, 'name':'Mohammad', 'family':'Dori'\u003e,\n    \u003c'id':2, 'name':'John', 'family':'Gits'\u003e\n]\n```\n\n```python\nprint(Person.filter(id=1, name='Mohammad'))\n```\n\n```python\n# Result:\n[\n    \u003c'id':1, 'name':'Mohammad', 'family':'Dori', 'age':20, 'phone':1234567890, 'salary':110000.0\u003e\n]\n```\n\n#\n\n## Advance Filtering\n\nYou can use operators in filter method. like AND, OR, NOT, BETWEEN, LIKE, IN, =, !=, \u003c, \u003c=, \u003e, \u003e=.\n\n**AND**: e.g. `AND(x='', y=123)` that means `x='' AND y=123`\n\n```python\nrows = Person.filter(\n    AND(id=2, name='Ali')\n)\n```\n\n**OR**: e.g. `OR(x='', y=123)` that means `x='' OR y=123`\n\n```python\nrows = Person.filter(\n    OR(id=2, name='Ali')\n)\n```\n\n**NOT**: e.g. `NOT(OR(x='', y=123))` that means `NOT (x='' OR y=123)`\n\n```python\nrows = Person.filter(\n    NOT(AND(id=2, name='Ali'))\n)\n```\n\nYou can use another operator in operator.\n\n```python\nrows = Person.filter(\n    OR(OR(name='Ali', id=2), OR(salary=10, age=20))\n)\n```\n\n**BETWEEN**: Return row, if it value between x and y.\n\n```python\nprint(Person.filter(id__between=(2, 8)))\n```\n\n**LIKE**: Use pattern with % and \\_ to filter rows.\n\n```python\nprint(Person.filter(\n    name__like='Mo%',\n    config=ResultConfig(\n        limit=2,\n        order_by='age',\n    )\n))\n```\n\n**lt**: less than, means `\u003c`\n\n```python\nprint(Person.filter(id__lt=5))\n```\n\n**lte**: less than or equal, means `\u003c=`\n\n```python\nprint(Person.filter(id__lte=5))\n```\n\n**gt**: greater than, means `\u003e`\n\n```python\nprint(Person.filter(id__gt=5))\n```\n\n**gte**: greater than or equal, means `\u003e=`\n\n```python\nprint(Person.filter(id__gte=5))\n```\n\n**not**: not equal, means `!=`\n\n```python\nprint(Person.filter(id__n=5))\n```\n\nYou can use any filter together.\n\n```python\nprint(Person.filter(\n    OR(\n        id__n=5,\n        name__in=('Mohammad', 'Salar'),\n        age__gte=8\n    )\n))\n```\n\n#\n\n## Result Methods\n\n`result.count()` return count of results.\u003cbr\u003e\n`result.first()` return first row in result.\u003cbr\u003e\n`result.last()` return last row in result.\n\n```python\nnot_mohammad = Person.filter(name__n='Mohammad')\nprint(not_mohammad.count())\nprint(not_mohammad.first())\nprint(not_mohammad.last())\n```\n\nIterate on result.\n\n```python\nfor row in not_mohammad:\n    print(row.name)\n    row.remove()\n    # row.update(...)\n```\n\n#\n\n## Update Row\n\n```python\nperson1 = Person(\n    name='Mohammad',\n    family='Dori',\n    age=20,\n    phone=1234567890,\n    salary=110_000,\n)\n\nprint(person1)\nperson1.update(name='Salar')\nprint(person1)\n```\n\n#\n\n## Table Class Method\n\n**max**: Return maximum value of column.\n\n```python\nprint(Person.max('salary'))\n```\n\n**min**: Return minimum value of column.\n\n```python\nprint(Person.min('salary'))\n```\n\n**sum**: Return sum of column values.\n\n```python\nprint(Person.sum('salary'))\n```\n\n**avg**: Return average of column values.\n\n```python\nprint(Person.avg('salary'))\n```\n\n**count**: Return count of rows in table.\n\n```python\nprint(Person.count())\n```\n\n**first**: Return first row of table.\n\n```python\nprint(Person.first())\n```\n\n**last**: Return last row of table.\n\n```python\nprint(Person.last())\n```\n\n#\n\n## Result configuration\n\n`limit` Limit the number of result rows.\u003cbr\u003e\n`order_by` Order result by columns.\u003cbr\u003e\n`reverse` Use with order_by, False means sort ASC and True means sort DESC.\n\n```python\nprint(Person.all(\n    config=ResultConfig(\n        order_by='id',\n        reverse=True\n    )\n))\nprint(Person.get(\n    config=ResultConfig(\n        limit=5\n    )\n))\n```\n\n#\n\n## Foreign Key\n\n```python\nperson1 = Person(\n    name='Mohammad',\n    family='Dori',\n    age=20,\n    phone=1234567890,\n    salary=110_000,\n)\nschool1 = School(\n    name='The Sample School',\n    created_at='2002-01-04',\n    address='1600 Amphitheatre Parkway in Mountain View, California',\n)\n\nprint(school1)\n\nstudent = Student(\n    person=person1,\n    school=school1,\n    class_name='A3',\n)\n\nprint(school1.id)\nprint(person1.id)\n\nprint(student)\n```\n\n#\n\n## Change Easy\n\nRemove `class_name` column and add gpa column. now add a row to table.\n\n```python\nclass Student(DB):\n    person = columns.ForeignKey(Person)\n    school = columns.ForeignKey(School)\n    gpa = columns.TinyInt(default=20)\n\nperson1 = Person(\n    name='Mohammad',\n    family='Dori',\n    age=20,\n    phone=1234567890,\n    salary=110_000,\n)\nschool1 = School(\n    name='The Sample School',\n    created_at='2002-01-04',\n    address='1600 Amphitheatre Parkway in Mountain View, California',\n)\n\nprint(school1)\n\nstudent = Student(\n    person=person1,\n    school=school1,\n    gpa=10,\n)\n\nprint(school1.id)\nprint(person1.id)\n\nprint(student)\n```\n\n#\n\n## See All Query Usage\n\n```python\nprint(Person.queries())\n```\n\n#\n\n# Links\n\nDownload Source Code: [Click Here](https://github.com/dori-dev/my-orm/archive/refs/heads/main.zip)\n\nMy Github Account: [Click Here](https://github.com/dori-dev/)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdori-dev%2Fmy-orm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdori-dev%2Fmy-orm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdori-dev%2Fmy-orm/lists"}