Maison > développement back-end > Tutoriel Python > Un article expliquant en détail quels frameworks ORM sont utilisés dans le développement de sites Web Python

Un article expliquant en détail quels frameworks ORM sont utilisés dans le développement de sites Web Python

Tomorin
Libérer: 2018-08-23 17:47:21
original
1526 Les gens l'ont consulté

Dans l'article précédent, nous avons plus ou moins introduit les connaissances sur Python, et en combat réel, nous devons utiliser la page de développement python En fait, en utilisant La page de développement du framework est la plus simple et la plus facile. Dans ce chapitre, nous présenterons l'utilisation du orm framework dans le Développement de pages Python pour développer des pages.

Qu'est-ce que l'ORM

ORM c'est-à-dire le mappage relationnel d'objets , le nom complet est le mappage relationnel objet. Mais ça fait quoi ?

Si vous avez été exposé à une optimisation en arrière-plan Web, nous savons qu'une grande partie du travail en arrière-plan Web consiste à ajouter, supprimer, modifier et interroger des données. Si vous devez vous connecter à la base de données, construisez SQL. et exécuter des instructions SQL à chaque fois que vous utilisez la base de données, cela sera inévitable. C'est trop gênant, nous pouvons donc établir une relation de mappage un-à-un entre les tables, les champs et les lignes de la base de données et les classes, classes. attributs et objets dans notre programmation orientée objet, afin que nous puissions éviter d'exploiter directement la base de données. Il suffit d'appeler la méthode correspondante.

Prenez ma pratique passée comme exemple pour comprendre. Par exemple, pour mettre en œuvre un enregistrement d'utilisateur, comment je le faisais auparavant était que la réception récupérait les données et les transmettait au backend, puis les chaînes d'arrière-plan étaient épissées ​​pour former une instruction SQL, qui a été exécutée en arrière-plan.
Avec
ORM
, il me suffit d'instancier un objet User avec des données, puis d'appeler la méthode save de l'objet pour l'enregistrer dans la base de données. En tant qu'utilisateur, je n'ai pas besoin d'opérer. une instruction SQL. En supposant que la classe User correspond à la table des utilisateurs

J'ai demandé, ne serait-il pas confortable d'utiliser comme ça ?
user=User(id="100001",name="Andy",password="*****")
user.save()  //保存到数据库
user=User.findById("100001") #从数据库中找出id为"100001"的用户
user.update(password="*********")  #更改id为"100001"的用户密码
users=User.findAll() #取出users表中全部数据
Copier après la connexion

RemarqueLes opérations IO sont toutes asynchrones et la bibliothèque asynchrone utilisée est asyncio

La base de données liée est mysql 5.7, utilisée Le Le pilote IO asynchrone mysql implémente les préparations nécessaires pour ORM pour aiomysql


---encapsule les opérations de base de données

pour créer un pool de connexions à une base de données

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),
)
Copier après la connexion

encapsule la méthode select

En plus de la méthode select renvoyant le contenu de la requête, le reste Les mises à jour, insertion et suppression ci-dessous n'ont besoin de renvoyer qu'un certain nombre de lignes affectées, afin que les trois puissent être encapsulées dans une méthode d'exécution
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
Copier après la connexion

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
Copier après la connexion

Commencez à implémenter ORMIl existe une idée en programmation appelée "top-down". Alors quand on ne sait pas concevoir un

ORM

, on peut supposer qu'il existe déjà un framework ORM. Comment veux-tu l'utiliser ?

Avez-vous remarqué qu'en regardant la classe User de cette façon, il est très clair qu'elle correspond à la table user et on voit d'un coup d'œil quels sont les champs de cette table. Laissez ensuite la sous-classe hériter de la classe parent pour réaliser la réutilisation des méthodes find, save... et autres. C'est parfait, mais comment y parvenir ?
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()
Copier après la connexion

字段类的实现

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)
  # 其它字段略,一个道理,一个模式
Copier après la connexion


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal