• 【python】SQLAlchemy(一)


    ORM

    ORM(Object Rational Mapping),对象关系映射。用于把对象模型表示的对象映射到基于SQL的关系模型数据库结构中去。操作对象的属性就等于操作数据库中的记录。


    ORM优点

    a)         清楚直观,避免直接写SQL

    b)         可以轻松写出复杂的查询(还好看

    c)         可移植性强


    py2和py3

     由于py3已经不支持mysqldb这个模块了,可用PyMySql代替。

    连接数据库的链接也由

    'mysql+mysqlconnector://root:root@localhost:3306/test'变为
       'mysql+pymysql://root:root@localhost:3306/test'

    基本操作

    a)         创建并连接引擎

    #-*- coding:UTF-8 -*-
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    engine_url = 'mysql+mysqlconnector://root:root@localhost:3306/test' #数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名 

    engine_ = created_engine(engine_url, encoding='utf-8', echo=True) #echo 打印过程
    Session_class = sessionmaker(engine_) #创建一个session工厂
    Session = Session_class() #创建一个session类

    b)         数据操作

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import  Column, Integer, String
    Base = declarative_base() #sqlalchemy基础类
    
    class User(Base):
        __tablename__ = 'user'
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        password = Column(String(64))
    
        def __repr__(self):
            res = ""{{id:{id},name:{name},pwd:{pwd}}}"".format(id=self.id, name=self.name, pwd= self.password)
            return res
    
    #create table
    Base.metadata.create_all(engine_) 
    
    #insert
    user1 = User(name="LiMing", password="hahahah")
    user2 = User(name="HanMeiMei", password="ohuohuo")
    Session.add(user1)
    Session.add(user2)
    
    #select
    data = Session.query(User).filter(User.id<3).all()
    print(data)#返回的data是class,如果是多条数据则返回list,记录的值在相应的属性里;
    #如果不选择查找属性(all/one/first)则data为解析的sql语句
    #update data[0].name = "New" data[0].password = "New pwd" Session.commit() #delete Session.delete(data[1]) # *提交以上所有操作 Session.commit()

    d)         提交操作

     

    Session.commit()

     relationship

    relationship用于定义表与表的关系。

    比如有用户表user、文章表article。文章是某个用户写的,一个用户可拥有多个文章。这是一对多关系。

    class User(BASE):
        __tablename__ = 'users'
    
        id = Column(Integer, primary_key=True)
        username = Column(String(64), nullable=False, index=True)
        password = Column(String(64), nullable=False)
        email = Column(String(64), nullable=False, index=True)
        articles = relationship('Article', backref='author')   # 文章和用户的关系链接
       

        使用backref就不用在Article里面再反向relationship user了

        relationship有一个很常用的参数lazy。默认值为'select',可选还有‘dynamic’(只能在一对多和多对多中使用)、joined(联结操作)。区别之后单说


    批量插入

    data = []
    from random import randint,choice
    #method1 ORM
    for i in range(10):
        one = Student(
            class_id = randint(1,4),
            name = 'Student'+str(i+1),
            sex = choice([0,1]),
            age = randint(9,13)
        )
        data.append(one)
    
    Session.add_all(data)
    Session.commit()
    #method2 非ORM 快一些
    for i in range(10,20):
        data.append(
            {'class_id':'randint(1,4)', 'name':'Student'+str(i+1), 'sex':choice([0,1]), 'age' : randint(9,13)}
        )
    
    Session.execute(Student.__table__.insert(), data)
    Session.commit()

     

     

  • 相关阅读:
    【C++】《C++ Primer 》第二章
    【剑指Offer】链表的基本操作之创建、插入、删除
    【LeetCode】365.水壶问题
    【Flutter】事件处理与通知之原始指针事件处理
    【Flutter】功能型组件之对话框详解
    【Flutter】功能型组件之异步UI更新
    mongdb_基本操作
    startswith在项目中的应用
    subString在项目中的应用
    comtains在项目中的应用
  • 原文地址:https://www.cnblogs.com/Hed-geh0g/p/8336757.html
Copyright © 2020-2023  润新知