>  기사  >  백엔드 개발  >  Python 웹 사이트 개발에 사용되는 ORM 프레임워크를 자세히 설명하는 기사

Python 웹 사이트 개발에 사용되는 ORM 프레임워크를 자세히 설명하는 기사

Tomorin
Tomorin원래의
2018-08-23 17:47:211451검색

이전 글에서는 Python에 대한 지식을 어느 정도 소개했고, 실제 전투에 관해서는 python 개발 페이지를 활용하겠습니다. 실제로 프레임워크를 사용하여 페이지를 개발하는 것이 가장 간단하고 쉽습니다. 이번 장에서는 Python 페이지 개발에서 orm 프레임워크 의 사용법을 소개합니다.

orm이란 무엇입니까 #ORM 객체 관계형 매핑
입니다. 전체 이름은 다음과 같습니다. 객체 관계 매핑.

그런데 정확히 어떤 역할을 하나요?

일부 웹 백엔드 기술을 접해 본 적이 있다면 웹 백엔드 작업의 상당 부분이 데이터 추가, 삭제, 수정 및 쿼리라는 것을 알고 있습니다. sql 문을 구성하고 데이터베이스를 운영할 때마다 sql 문을 실행하면 너무 번거롭기 때문에 데이터베이스의 테이블, 필드, 행과 클래스, 클래스 간의 일대일 매핑 관계를 설정할 수 있습니다. 객체 지향 프로그래밍의 속성 및 객체를 사용하여 데이터베이스를 직접 조작하지 않고 해당 메소드를 호출할 수 있습니다. 이해를 돕기 위해 제가 과거에 했던 일을 예로 들어보겠습니다. 예를 들어 사용자 등록을 구현하기 위해 제가 이전에 했던 방식은 프런트 데스크에서 데이터를 받아 백엔드로 전달한 다음 배경 문자열을 연결하는 것이었습니다. ​​백그라운드에서 실행되는 SQL 문을 구성합니다. ORM을 사용하면 데이터가 포함된 User 개체를 인스턴스화한 다음 해당 개체의 save 메서드를 호출하여 이를 데이터베이스에 저장하기만 하면 됩니다. SQL 문.

User 클래스가 users 테이블에 해당한다고 가정

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

방금 물어봤는데 이렇게 사용하면 편하지 않나요?

Note

IO 작업은 모두 비동기식이며 사용되는 비동기 라이브러리는 asyncio

입니다. 연결된 데이터베이스는 mysql 5.7이고, 사용된 mysql 비동기 IO 드라이버는 aiomysqlORM 구현에 필요한 준비---데이터베이스 작업 캡슐화

#🎜🎜 #


데이터베이스 연결 풀 생성

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),
)

캡슐화 선택 방법# 🎜🎜#

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
쿼리 내용을 반환하는 select 메서드 외에 나머지 업데이트, 삽입 및 삭제는 영향을 받는 행 수만 반환하면 되므로 하나의 실행 메소드로 패키징 가능
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

ORM 구현 시작

프로그래밍에는 아이디어가 있습니다 "하향식"이라고합니다. 따라서

ORM

을 어떻게 디자인해야 할지 모른다면 이미

ORM 프레임워크 가 있다고 가정할 수 있습니다. 이를 어떻게 사용하시겠습니까?

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()
User 클래스를 이런 식으로 보면 이것이 사용자 테이블에 해당하고 이 테이블에 어떤 필드가 있는지가 매우 명확하므로 한 눈에 알 수 있습니다. 그런 다음 하위 클래스가 상위 클래스를 상속하여 찾기, 저장... 및 기타 메서드의 재사용을 실현하도록 합니다. 완벽하지만 어떻게 달성할 수 있나요?

字段类的实现

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)
  # 其它字段略,一个道理,一个模式


위 내용은 Python 웹 사이트 개발에 사용되는 ORM 프레임워크를 자세히 설명하는 기사의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.