Home  >  Article  >  Backend Development  >  An article explaining in detail which ORM frameworks are used in Python website development

An article explaining in detail which ORM frameworks are used in Python website development

Tomorin
TomorinOriginal
2018-08-23 17:47:211451browse

In the previous article, we more or less introduced the knowledge about Python, and in actual combat, we have to use python development page. In fact, using Framework Development Page is the simplest and easiest. In this chapter, we will introduce the development of pages using the orm framework in Python page development.

What is ORM

##ORM that is Object Relational Mapping, the full name is object relational mapping.

But what does it do?

If you have come into contact with some web background optimization, we know that a large part of the work in the web background is the addition, deletion, modification and query of data. If you have to connect to the database, construct sql statements, and execute sql statements every time you operate the database, it will be unavoidable. It's too troublesome, so we can establish a one-to-one mapping relationship between the tables, fields, and rows in the database and the classes, class attributes, and objects in our object-oriented programming, so that we can avoid directly operating the database. Just call the corresponding method.
You can understand by taking an example of what I did in the past. For example, to implement a user registration, how I did it before was that the front desk got the data and passed it to the backend, and then the background strings were spliced ​​to form a sql statement, which was executed in the background.
With
ORM, I only need to instantiate a User object with data, and then call the save method of the object to save it to the database. As a user, there is no need to operate a SQL statement statement. Assume that the User class corresponds to the users table

user=User(id="100001",name="Andy",password="*****")
user.save()  //保存到数据库
user=User.findById("100001") #从数据库中找出id为"100001"的用户
user.update(password="*********")  #更改id为"100001"的用户密码
users=User.findAll() #取出users表中全部数据

I asked, isn’t it comfortable to use like this?

Note

IO operations are all asynchronous, and the asynchronous library used is asyncio

The linked database is mysql 5.7, used The mysql asynchronous IO driver is the necessary preparation for aiomysql

to implement ORM --- encapsulating database operations

Create database Connection pool

import asyncioimport aiomysql       
async def create_pool(**kw):global __pool
__pool=await aiomysql.create_pool(
    host=kw.get('host','localhost'),
    port=kw.get('port',3306),
    user=kw['user'],
    password=kw['password'],
    db=kw['db'],
    charset=kw.get('charset','utf8'),
    autocommit=kw.get('autocommit',True), # 自动提交事务
    maxsize=kw.get('maxsize',10),  # 池中最多有10个链接对象
    minsize=kw.get('minsize',1),
)

Encapsulates the select method

async def select(sql,args,size=None): //size可以决定取几条
global __pool
with (await __pool) as conn:
    cur=await conn.cursor(aiomysql.DictCursor) 
    # 用参数替换而非字符串拼接可以防止sql注入
    await cur.execute(sql.replace('?','%s'),args)  
    if size:
        rs=await cur.fetchmany(size) 
    else:
        rs=await cur.fetchall()  
    await cur.close()
    return rs

In addition to the select method that returns the query content, the remaining update, Both insert and delete only need to return a number of affected rows, so the three of them can be encapsulated into one execute method

def execute(sql,args):
global __pool
try:    
    with (await __pool) as conn:
      cur=await conn.cursor()        
         await cur.execute(sql.replace('?', '%s'), args)
      affected=cur.rowcount
         await cur.close()
except BaseException as e:
    raise e
return affected

Start implementing ORM

There is an idea in programming called "top-down". So when you don't know how to design

ORM, you can assume that there is already an ORM framework, how do you want to use it?

class Model(object):
    async def find(self):
       pass
class User(Model):
    # 注意这里的都是类属性
    __table__="users"
    id=StringField(...)
    name=StringField(...)
user=User(id="10001",name="Andy")
user.save()

Have you noticed that when you look at the User class like this, it is very clear that it corresponds to the user table and it is clear at a glance what fields this table has. Then let the subclass inherit the parent class to realize the reuse of find, save... and other methods. It's perfect, but how to achieve it?

字段类的实现

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 &#39;<%s:%s>&#39; % (self.__class__.__name__,self.name)  
   class StringField(Field):
    def __init__(self,name=None,primary_key=False,default=None,ddl=&#39;varchar(100)&#39;): 
      super(StringField,self).__init__(name,ddl,primary_key,default)
  # 其它字段略,一个道理,一个模式


The above is the detailed content of An article explaining in detail which ORM frameworks are used in Python website development. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn