zoukankan      html  css  js  c++  java
  • 第十三章-数据库

    1 数据库

      为了存储数据并且能够快速查询等功能专门形成的

      现代使用的数据库一般都是关系型数据库

      NoSQL尽管宣传其速度和规模远远超过关系数据库, 但是还是要先明白SQL

      常用的数据库有Oracle, SQL Server, DB2, MySQL, PostgreSQL, sqlite

    2 使用SQLite

      SQLite就是一嵌入式的数据库, 数据库就是一个文件, 本身是c写的, 体积更小

      python中内置了SQLite3

      1) 建立数据库链接

    db_file = os.path.join(os.path.dirname(__file__), 'test.db')
    if os.path.isfile(db_file):
        os.remove(db_file)
    conn = sqlite3.connect(db_file)
    

      2) 生成游标cursor

    cursor = conn.cursor()
    

      3) 执行SQL语句

    cursor.execute('create table user(id varchar(20) primary key, name varchar(20), score int)')
    cursor.execute(r"insert into user values ('A-001', 'Adam', 95)")
    cursor.execute(r"insert into user values ('A-002', 'Bart', 62)")
    cursor.execute(r"insert into user values ('A-003', 'Lisa', 78)")
    

      4) 查询并获得结果

    cursor.execute(r"SELECT name FROM user WHERE score > ? and score < ? ORDER BY score", (low, high))
    values = cursor.fetchall()
    

      5) 关闭游标, 提交事务, 断开链接

    cursor.close()
    conn.commit()
    conn.close()
    

    3 使用mysql

      mysql是世界上使用最广泛的数据库服务器, 能够承受高并发

      mysql内部有多种数据库引擎, 最常用的引擎是支持数据库事务的lnnoDB

      设置编码为UTF8

      安装

    pip install mysql-connector-python --allow-external mysql-connector-python
    # 如果上述失败执行可以执行这句
    pip install mysql-connector

      1) 建立连接并生成游标

    import mysql.connector
    conn = mysql.connector.connect(user='root', password='password', database='test')
    cursor = conn.cursor()
    

      2) 执行语句, 查询和获得结果

    cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
    cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
    print(cursor.rowcount)
    cursor.execute('select * from user where id = %s', ('1',))
    values = cursor.fetchall()
    print(values)
    

      3) 提交事务, 关闭游标关闭连接

    conn.commit()
    cursor.close()
    conn.close()
    

    4 使用SQLAlchemy

      数据库是一个二维表, 包含多行多列

      在Python可以构造一个结构来对应这个多行多列的表, 可以用一个列表存储整个表, 每一行用一个元组表示放入到列表中

      但是由于用元组表示一行还是不直观

      可以根据表格的内容, 对应一行的信息创建一个类, 那么每一行就是这个类的对象

      这就是ORM(object-relational mapping)

      在Python中最有名的orm框架是SQLAlchemy

      安装SQLAlchemy

    pip install sqlalchemy

      使用SQLAlchemy

      1) 导入必要内容

    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    

      2) 创建对象类的基类

    Base = declarative_base()
    

      3) 继承该基类创建对象类

    class User(Base):
        # 表的名字:
        __tablename__ = 'user'
    
        # 表的结构:
        id = Column(String(20), primary_key=True)
        name = Column(String(20))
    

      4) 创建数据库链接

    engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
    

      链接格式为

    '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'

      5) 将数据库链接绑定给sessionmaker来创建DBSession, 并生成session对象

    DBSession = sessionmaker(bind=engine)
    session = DBSession()
    

      6) 创建一个user对象并添加到表中

    new_user = User(id='5', name='Bob')
    session.add(new_user)
    session.commit()
    session.close()
    

      7) 执行查询操作

    user = session.query(User).filter(User.id=='5').one()
    print('type:', type(user))
    print('name:', user.name)
    session.close()
    

      其中query()用于创建一个查询

      filter()用于创建一个where条件

      one()表示返回一行, all()返回所有行

      关于对象之间的关系

        根据外键可以实现一对多, 多对多等关联

        一对多的关系设定如下

    class User(Base):
        __tablename__ = 'user'
    
        id = Column(String(20), primary_key=True)
        name = Column(String(20))
        # 一对多:
        books = relationship('Book')
    
    class Book(Base):
        __tablename__ = 'book'
    
        id = Column(String(20), primary_key=True)
        name = Column(String(20))
        # “多”的一方的book表是通过外键关联到user表的:
        user_id = Column(String(20), ForeignKey('user.id'))
    

      

     

    人若有恒 无所不成
  • 相关阅读:
    Vue自带的过滤器
    Spring Boot定时任务应用实践
    iOS中NSDate常用转换操作整合
    iOS中NSFileManager文件常用操作整合
    定位城市的封装
    微信支付和支付宝的封装
    App审核被拒(后台定位被拒,ipv6被拒,广告标示被拒的解决方案)
    按钮图片文字随意摆放
    设备信息大全
    Library not found for -lAPOpenSdk
  • 原文地址:https://www.cnblogs.com/weihuchao/p/6895080.html
Copyright © 2011-2022 走看看