zoukankan      html  css  js  c++  java
  • 【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()

     

     

  • 相关阅读:
    dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
    dotnet 控制台读写 Sqlite 提示 no such table 找不到文件
    dotnet 控制台 Hangfire 后台定时任务
    dotnet 控制台 Hangfire 后台定时任务
    dotnet 获取指定进程的输入命令行
    dotnet 获取指定进程的输入命令行
    PHP sqrt() 函数
    PHP sinh() 函数
    PHP sin() 函数
    PHP round() 函数
  • 原文地址:https://www.cnblogs.com/Hed-geh0g/p/8336757.html
Copyright © 2011-2022 走看看