Package: helo
🌎  [English] ∙ [简体中文]Helois a simple and small low-level asynchronous ORM using Pythonasyncio.
It is very intuitive and easy to use.Helo can help you easily build expressive common SQL statements in your asynchronous applications.
You only need to use friendly object-oriented APIs to manipulate data without caring about the details of SQL statement writing and data processing.Requires: Python 3.7+Now only supports MySQL, and the version is 5.7+Integration with web Framework:quart, seewith quartNot supports table relationshipQuickstartSee thewikipage for more information andquickstartdocumentation.Installation$pipinstallheloSee theinstallationwiki page for more options.Basic ExamplesFirst, you should to importheloand instantiate a global variable withhelo.Gimporthelodb=helo.G()Defining models is simple:classAuthor(helo.Model):id=helo.BigAuto()name=helo.VarChar(length=45,null=False)email=helo.Email(default='')password=helo.VarChar(length=100,null=False)create_at=helo.Timestamp(default=helo.ON_CREATE)classPost(helo.Model):id=helo.Auto()title=helo.VarChar(length=100)author=helo.Int(default=0)content=helo.Text(encoding=helo.ENCODING.UTF8MB4)create_at=helo.Timestamp(default=helo.ON_CREATE)update_at=helo.Timestamp(default=helo.ON_UPDATE)Show some basic examples:importasyncioimportdatetimeasyncdefshow_case():# Binding the database(creating a connection pool)awaitdb.bind('mysql://user:password@host:port/db')# Creating tablesawaitdb.create_tables([Author,Post])# Inserting few rows:author=Author(name='at7h',password='1111')author_id=awaitauthor.save()print(author_id)# 1authors=awaitAuthor.get(author_id)print(author.id,author.name)# 1, at7hawaitAuthor.update(email='g@gmail.com').where(Author.id==author_id).do()ret=awaitAuthor.insert(name='pope',password='2222').do()posts=[{'title':'Python','author':1},{'title':'Golang','author':2},]ret=awaitPost.minsert(posts).do()print(ret)# (2, 1)# Supports expressive and composable queries:count=awaitAuthor.select().count()print(count)# 2# Last gmail authorauthor=awaitAuthor.select().where(Author.email.endswith('gmail.com')).order_by(Author.create_at.desc()).first()print(author)# [<Author object at 1>]# Using `helo.adict`authors=awaitAuthor.select(Author.id,Author.name).where(Author.id<2).all(wrap=False)print(author)# [{'id': 1, 'name': 'at7h'}]# Paginate get authors who wrote Python posts this yearauthors=awaitAuthor.select().where(Author.id.in_(Post.select(Post.author).where(Post.update_at>datetime.datetime(2019,1,1),Post.title.contains('Python')).order_by(Post.update_at.desc()))).paginate(1,10)print(authors)# [<Author object at 1>]# How many posts each author wrote?author_posts=awaitAuthor.select(Author.name,helo.F.COUNT(helo.SQL('1')).as_('posts')).join(Post,helo.JOINTYPE.LEFT,on=(Author.id==Post.author)).group_by(Author.name).rows(100)asyncio.run(show_case())With QuartIf you’re usingquart, a minimum application example should be:importquartimportheloapp=quart.Quart(__name__)app.config["HELO_DATABASE_URL"]="mysql://user:password@127.0.0.1:3306/db"db=helo.G(app)@app.route('/api/authors')asyncdefauthors():awaitAuthor.insert(name='at7h',email='g@test.com',password='xxxx').do()author_list=awaitAuthor.select().all(False)returnquart.jsonify(author_list)app.run()Start it:$curlhttp://127.0.0.1:5000/api/authors[{"email":"g@test.com","id":1,"name":"at7h","password":"xxxx"}]👉 Seemore examplesContributing 👏I hope those who are interested can join in and work together.Any kind of contribution is expected:
report a bug 🐞, give a advice or create a pull request 🙋‍♂️.Thanks 🤝Special thanks to projectsaiomysqlandpeewee, helo usesaiomysql(as the MySQL connection driver),
and referencedpeeweein program design.Please feel free to ⭐️ this repository if this project helped you 😉 !