zoukankan      html  css  js  c++  java
  • Python操作三大主流数据库

    第1章 数据库简介

    简单介绍Mysql、数据库简介、导学篇

    第2章 mysql基础

    XAMPP 集成好的 最流行的PHP开发环境

    mac 版本的mysql 安装
    https://www.cnblogs.com/myxq666/p/7787744.html

    数据库调试代码

    -- 数据库链接小测试
    CREATE DATABASE `mydatabase`;
    USE `mydatabase`;
    
    CREATE TABLE `students`(
        `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,   -- 【解释】 id 整数类型 不为空 自动增长
        `name` VARCHAR(200) NOT NULL,
        `nickmane` VARCHAR(200)  NULL,
        `sex` CHAR(20) NULL,
        `in_time` DATETIME NULL
    ) DEFAULT CHARACTER SET utf8 ;
    
    -- 插入一条语句
    INSERT INTO `students`  VALUE(1, 'sss', 's', '1', NOW())
    
    -- 【解释】 id 整数类型 不为空 自动增长
    INSERT INTO `students`  VALUE(1, '张三', '三', '男', NOW())
    INSERT INTO `students`  VALUE(2, '张三', '三', '男', NOW())
    INSERT INTO `students`  VALUE(3, '张三', '三', '男', NOW())
    INSERT INTO `students`  VALUE(4, 'zhangsan', 'san', 'nan', NOW())
    INSERT INTO `students`  VALUE(5, 'sadsadsa', 'ewqewq', 'fleman', NOW())
    
    select * from `students`
    
    # -- coding: utf-8 --
    import MySQLdb
    
    
    class MysqlSearch(object):  # 让MysqlSearch类继承object对象
    
        def __init__(self):  # 在初始化的时候调用
            self.get_conn()
    
        def get_conn(self):  # 数据库链接
            try:
                self.conn = MySQLdb.connect(
                    host="localhost",
                    user="root",
                    passwd="ljc123456",
                    db="mydatabase",
                    port=3306,
                    charset='utf8'
                    )
            except MySQLdb.Error as e:
                print("Error : %s" % e)
    
        def close_conn(self):   # 关闭数据库
            try:
                if self.conn:
                    # 关闭链接
                    self.conn.close()
            except MySQLdb.Error as e:
                print("Error: %s" % e)
    
        def get_more(self):
            sql = "select * from `students`"
            cursor = self.conn.cursor()
            cursor.execute(sql)
            rest = cursor.fetchall()
            cursor.close()
            return rest
    
    
    def main():
        obj = MysqlSearch()
    
        re = obj.get_more()
    
        print(re)
        print(type(re))
    
        obj.close_conn()
    
        pass
    
    
    if __name__ == '__main__':
        main()
    
    """ 数据库链接测试成功
    问题1:
    OperationalError: (2006, 'SSL connection error: SSL_CTX_set_tmp_dh failed') 
    把 127.0.0.1 换成 localhost
    import MySQLdb
    MySQLdb.connect(
                    host="localhost",
                    user="root",
                    passwd="ljc123456",
                    db="mydatabase",
                    port=3306,
                    charset='utf8'
                    )
    
    import pymysql
    pymysql.connect(
                    host="localhost",
                    user="root",
                    passwd="ljc123456",
                    db="mydatabase",
                    port=3306,
                    charset='utf8'
                )
    
    问题2:
    <bound method MysqlSearch.get_more of <__main__.MysqlSearch object at 0x107922390>>
    sql = "select * from `students`" 写成了 sql = "select * from `students`;"
    """
    

    2-2 mysql图形化管理工具

    • Mysql语法

      1. show databases; 查看所有数据库
      2. use baidu;使用某一个数据库
      3. show tables; 查看数据库的数据表
    • 图形化的管理工具:
      * Php my Admin
      * Navicat for mysql
      2-3 sql语法基础-创建并使用数据库

    • DDL 数据定义语句
      * CREATE table/database 创建
      * ALTER table/database 修改
      * DROP table/database 删除

    • DML 数据管理语句
      * INSERT 增加
      * DELETE 删除
      * UPDATE 更新
      * SELECT 查询
      1.创建数据库

    ——[注释]创建并使用数据库
    CREATE DATABASE `mydatabase`;      反引号
    USE `mydatabase`;
    
    一般对数据库的操作分为  只读  和  读写
    当我们在修改的时候采用读写  一般用只读来查询数据
    
    % 代表任何ip地址都可以访问
    
    localhost 127.0.0.1
    
    -- 新建数据库
    CREATE DATABASE `school`;
    -- 使用数据库
    USE `school`;
    -- 创建表格
    CREATE TABLE `students`(
        `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,   -- 【解释】 id 整数类型 不为空 自动增长
        `name` VARCHAR(200) NOT NULL,
        `nickmane` VARCHAR(200) NULL,
        `sex` CHAR(1) NULL,
        `in_time` DATETIME NULL
    );
    -- 常见类型: int char varchar datetime
    -- CHAR(200) 即使你存一个字符它也要用200个字节,这样很浪费空间。
    -- VARCHAR(200) 以实际用的内存为主
    -- NOT NULL 不为空 必须得填写
    -- NULL 可以为空
    -- 注意后面有一个分号 ;
    -- 数据库优化:mysql36条军规
    

    2-4 sql语法基础-创建表

    2-5 sql语法基础-插入和查询语句

    -- 新建查询
    -- 新建多条学生数据
    -- 插入语句
    
    USE `school`;
    -- 创建表格
    CREATE TABLE `students6`(
        `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,   -- 【解释】 id 整数类型 不为空 自动增长
        `name` VARCHAR(200) CHARACTER SET utf8 NOT NULL,
        `nickmane` VARCHAR(200) CHARACTER SET utf8  NULL,
        `sex` CHAR(20) CHARACTER SET utf8  NULL,
        `in_time` DATETIME NULL
    );
    
    
    
    CREATE TABLE `students`(
        `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,   -- 【解释】 id 整数类型 不为空 自动增长
        `name` VARCHAR(200) NOT NULL,
        `nickmane` VARCHAR(200)  NULL,
        `sex` CHAR(20) NULL,
        `in_time` DATETIME NULL
    ) DEFAULT CHARACTER SET utf8 ;
    -- 显示中文要加上默认设置
    -- 插入一条语句
    INSERT INTO `students`  VALUE(1, 'sss', 's', '1', NOW())
    
    -- 【解释】 id 整数类型 不为空 自动增长
    INSERT INTO `students`  VALUE(1, '张三', '三', '男', NOW())
    INSERT INTO `students`  VALUE(2, '张三', '三', '男', NOW())
    INSERT INTO `students`  VALUE(3, '张三', '三', '男', NOW())
    INSERT INTO `students`  VALUE(4, 'zhangsan', 'san', 'nan', NOW())
    INSERT INTO `students`  VALUE(5, 'sadsadsa', 'ewqewq', 'fleman', NOW())
    
    INSERT INTO `students5`  VALUE(2, 'zhang', 'san', '0', NOW())
    
    INSERT INTO `students6`  VALUE(2, '张三', '三', '0', NOW())
    INSERT INTO `students6`  VALUE(1, 'ssswqewq', 'sqw', '1wew', NOW())
    INSERT INTO `students6`  VALUE(3, 'ssswqewq', 'sqw', '1wew', NOW())
    
    
    INSERT INTO `students6`  (`name`, `nickmane`, `sex`, `in_time`) VALUE('张三三多条数数据插入', '三三s', '男', NOW());
    
    INSERT INTO `students6`  (`name`, `nickmane`) VALUE('张三3', '三2s');
    -- 非空的记录是必须填写的。
    -- 插入多条语句
    -- 以分号;结尾 表示 一个语句
    -- 多行出入的时候通常以逗号,分隔。
    
    INSERT INTO `students6`  (`name`, `nickmane`) VALUES 
        ('张三X', '三X'),
        ('张三X1', '三X1'),
        ('张三X2', '三X2'),
        ('张三X3', '三X3'),
        ('张三X4', '三X4'),
        ('张三X5', '三X5'),
        ('张三X6', '三X6')
        ;
    
    /* ---- 查询语句 ---- */
    
    -- 查询表students6的所有数据的所有信息
    SELECT * from `students6`;
    
    -- 只查询数据的`name`以及 `nickmane`
    SELECT `name`, `nickmane` FROM `students6`;
    
    -- 查询所有性别为 男  的 数据信息
    SELECT `name`, `nickmane` FROM `students6` WHERE `sex`='男';
    SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男';
    
    -- 排序
    -- ASC 正序、DESC 倒序
    SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男' ORDER BY `id` DESC;
    
    /*
    查询条件书写的顺序
    SELECT     FROM 
    
    WHERE
    GROUP BY
    HAVING
    ORDER BY
    LIMIT 翻页  有两个参数 表述数据的起始位置(数据的偏移量),第二个数字表示多少个数据一页
    */
    SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男' ORDER BY `id` DESC LIMIT 0, 2;
    SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男' ORDER BY `id` DESC LIMIT 2, 2;
    SELECT `id`,`name`, `nickmane` FROM `students6` WHERE `sex`='男' ORDER BY `id` DESC LIMIT 4, 2;
    

    2-6 sql语法基础-修改和删除数据

    /*
    修改和删除数据
    
    修改:
    UPDATE  表  SET 修改的内容 WHERE  修改的哪些数据
    注意:不加 WHERE 条件 就是将所有数据修改 
    
    删除:
    DELETE FROM 表 WHERE 条件
    注意:不加 WHERE 条件 就是将所有数据删除 
    
    */
    
    -- 将不是男的性别设为女
    UPDATE `students6` SET `sex` = '女' WHERE `sex` != '男';
    
    
    UPDATE `students6` SET `sex` = '女' WHERE `sex` IS NULL;
    
    -- 将所有男生删除
    DELETE FROM `students6` WHERE `sex` = '男';
    
    -- 表中的数据全部删除
    DELETE FROM `students6`;
    
    

    2-7 设计新闻表

    ID: 新闻的唯一标示
    title:新闻的标题
    content:新闻的内容
    created_at:新闻添加的时间
    types:新闻的类型
    image:新闻的缩略图
    author:作者
    view_count:浏览量
    is_valid:删除标记 新闻是否有效

    删除:
    物理删除:在数据库中直接将数据删除掉
    逻辑删除:is_value 是否有效 ,有效1,无效0

    第3章 python API

    3-1 环境配置以及依赖安装

    1.mysqlclient 1.3.12的支持

    MySQL-5.5 through 5.7 and Python 2.7, 3.4+ are currently supported. PyPy is supported too.
    
    lijuncheng@lijunchengdeMacBook-Pro ~ $ pip install mysqlclient
    Collecting mysqlclient
      Downloading mysqlclient-1.3.12.tar.gz (89kB)
        100% |████████████████████████████████| 92kB 98kB/s
    Building wheels for collected packages: mysqlclient
      Running setup.py bdist_wheel for mysqlclient ... done
      Stored in directory: /Users/lijuncheng/Library/Caches/pip/wheels/df/bb/60/bf7c315cbe163515db1c846e4ffa5557dd785c82e82f3492e8
    Successfully built mysqlclient
    Installing collected packages: mysqlclient
    Successfully installed mysqlclient-1.3.12
    

    2.验证是否安装成功

    lijuncheng@lijunchengdeMacBook-Pro ~ $ python
    Python 2.7.13 |Anaconda custom (x86_64)| (default, Sep 21 2017, 17:38:20)
    [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import MySQLdb
    >>>
    

    3.python的虚拟环境 virtualenv python虚拟沙盒
    多python环境

    3-2 python链接mysql数据库

    1.使用python连接数据库
    连接到数据库之后,要关闭数据库。

    3-3 python查询mysql数据库

    # -- coding: utf-8 --
    import MySQLdb
    
    #中文输出. 只是为了在控制台上显示,字符的类型是正确的。
    def chinese_output(str_tuple):
        for i in range(len(str_tuple)):
            print str_tuple[i]
        pass
    
    #将获取链接封装成calss
    class MysqlSearch(object):  # 让MysqlSearch类继承object对象
    
        def __init__(self): # 在初始化的时候调用
            self.get_conn()
    
    
        def get_conn(self): # 数据库链接
            try:
                self.conn = MySQLdb.connect(
                    host = "127.0.0.1",
                    user = "root",
                    passwd = "admin123",
                    db = "news",
                    port = 3306,
                    charset = 'utf8'
                    )
            except MySQLdb.Error as e:
                print "Error : %s" % e
    
        def close_conn(self):   #关闭数据库
            try:
                if self.conn:
                    # 关闭链接
                    self.conn.close()
            except MySQLdb.Error as e:
                print "Error: %s" % e
    
        def get_one(self): #查询一条数据
            """ 流程:"""
            # 1.准备SQL
            sql = "SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC;"
            # 2.找到cursor
            cursor = self.conn.cursor()
            # 3.执行SQL
            cursor.execute(sql, ("本地", ))
             # 这边传的参数是一个元组
            # print cursor.rowcount # 一共多少行 
            # print cursor.description
            # 4.拿到结果
            # rest = cursor.fetchone() # 就查询一体哦啊结果
            rest = dict(zip([k[0] for k in cursor.description], cursor.fetchone()))
            # 5.处理数据
            #print rest
            #print rest['title']
            # 6.关闭cursor链接  两个关闭
            cursor.close()
            self.close_conn() 
    
            return rest
    
        def get_more(self):
            sql = "SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC;"
            cursor = self.conn.cursor()
            cursor.execute(sql, ("本地", ))
            # 多条数据获取的应该是一个list
            # 列表推倒式子
            rest = [dict(zip([k[0] for k in cursor.description], row)) 
                for row in cursor.fetchall() ]
            cursor.close()
            self.close_conn()
            return rest
    
    
        # 多条数据换页 
        def get_more_page(self, page, page_size):
            # 页面换算
            offset = (page - 1) * page_size # 启始页面
    
            sql = 'SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC LIMIT %s, %s;'
            cursor = self.conn.cursor()
            # 将数字转换为字符.  不用转换。 瞎忙活。 
            # offset_str = str(offset)
            # page_size_str = str(page_size)
    
            cursor.execute(sql, ('本地', offset, page_size, ))
            # 多条数据获取的应该是一个list
            # 列表推倒式子
            rest = [dict(zip([k[0] for k in cursor.description], row)) 
                for row in cursor.fetchall() ]
            cursor.close()
            self.close_conn()
            return rest
    
    def main():
        obj = MysqlSearch()
    
        #单个结果输出
        rest = obj.get_one()
        print rest['title']
    
        #多个结果删除。list
        rest_more = obj.get_more()
        for item in rest_more:
            print item
            print '-----------------------------------------------------------------------'
    
        #分页输出 
        rest_more_page = obj.get_more_page(1,1)
        for item in rest_more_page:
            print item
            print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    
    if __name__ == '__main__':
        main()
    

    3-4 python更新mysql数据

    # -- coding: utf-8 --
    import MySQLdb
    
    #中文输出. 只是为了在控制台上显示,字符的类型是正确的。
    def chinese_output(str_tuple):
        for i in range(len(str_tuple)):
            print str_tuple[i]
        pass
    
    #将获取链接封装成calss
    class MysqlSearch(object):  # 让MysqlSearch类继承object对象
    
        def __init__(self): # 在初始化的时候调用
            self.get_conn()
    
    
        def get_conn(self): # 数据库链接
            try:
                self.conn = MySQLdb.connect(
                    host = "127.0.0.1",
                    user = "root",
                    passwd = "admin123",
                    db = "news",
                    port = 3306,
                    charset = 'utf8'
                    )
            except MySQLdb.Error as e:
                print "Error : %s" % e
    
        def close_conn(self):   #关闭数据库
            try:
                if self.conn:
                    # 关闭链接
                    self.conn.close()
            except MySQLdb.Error as e:
                print "Error: %s" % e
    
        def get_one(self): #查询一条数据
            """ 流程:"""
            # 1.准备SQL
            sql = "SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC;"
            # 2.找到cursor
            cursor = self.conn.cursor()
            # 3.执行SQL
            cursor.execute(sql, ("本地", ))
             # 这边传的参数是一个元组
            # print cursor.rowcount # 一共多少行 
            # print cursor.description
            # 4.拿到结果
            # rest = cursor.fetchone() # 就查询一体哦啊结果
            rest = dict(zip([k[0] for k in cursor.description], cursor.fetchone()))
            # 5.处理数据
            #print rest
            #print rest['title']
            # 6.关闭cursor链接  两个关闭
            cursor.close()
            self.close_conn() 
    
            return rest
    
        def get_more(self):
            sql = "SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC;"
            cursor = self.conn.cursor()
            cursor.execute(sql, ("本地", ))
            # 多条数据获取的应该是一个list
            # 列表推倒式子
            rest = [dict(zip([k[0] for k in cursor.description], row)) 
                for row in cursor.fetchall() ]
            cursor.close()
            self.close_conn()
            return rest
    
    
        # 多条数据换页 
        def get_more_page(self, page, page_size):
            # 页面换算
            offset = (page - 1) * page_size # 启始页面
    
            sql = 'SELECT * FROM `news` WHERE `types` = %s ORDER BY `created_at` DESC LIMIT %s, %s;'
            cursor = self.conn.cursor()
            # 将数字转换为字符.  不用转换。 瞎忙活。 
            # offset_str = str(offset)
            # page_size_str = str(page_size)
    
            cursor.execute(sql, ('本地', offset, page_size, ))
            # 多条数据获取的应该是一个list
            # 列表推倒式子
            rest = [dict(zip([k[0] for k in cursor.description], row)) 
                for row in cursor.fetchall() ]
            cursor.close()
            self.close_conn()
            return rest
    
        def add_one(self):
            """事务处理"""
            try: 
                # 准备SQL
                sql =( 
                    "INSERT INTO `news` (`title`, `image`, `content`, `types`, `is_valid`) VALUE "
                    "( %s, %s, %s, %s, %s );"
                )
                 # 出现换行的时候用一个元组扩起来。 应用双引号扩起来
                # 获取链接和cursor
                cursor = self.conn.cursor()
                # 执行SQL
                cursor.execute(sql, ('标题7','0122.png', '新闻内容22', '推荐', 1))
                cursor.execute(sql, ('标题8','0122.png', '新闻内容22', '推荐', 'ss'))
                # 错误
                # 提交数据到数据库
                """ 如果不提交的事务的话。就是 已经提交多数据库 但是没有被保存  """
                # 提交事务
    self.conn.commit()
                # 关闭cursor
                cursor.close()
            except :
                print "Error"
                # self.conn.commit() # 部分提交
                self.conn.rollback() # 回滚
            # 关闭链接
            self.close_conn()    
    
    # 多选 + / 多行注释
    
    def main():
        obj = MysqlSearch()
    
        #单个结果输出
        # rest = obj.get_one()
        # print rest['title']
    
        #多个结果删除。list
        # rest_more = obj.get_more()
        # for item in rest_more:
        #     print item
        #     print '-----------------------------------------------------------------------'
    
        #分页输出 
        # rest_more_page = obj.get_more_page(1,1)
        # for item in rest_more_page:
        #     print item
        #     print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
        obj.add_one()
    
    if __name__ == '__main__':
        main()
    

    第4章 ORM

    4-1 ORM简介

    对象关系映射(Object Relational Mapping) 也就是将数据库中没一条记录变成一个对象。
    ORM的实现(python ORM的框架):
    1.SqlObject
    2.peewee
    3.Django‘s ORM Django 框架
    4.SQLAlchemy

    doc document 文档

    4-2 SQLAlchemy安装

    官方文档:https://docs.sqlalchemy.org/en/latest/core/tutorial.html

    DBAPI 对数据库的操作
    SQLAlchemy 对数据库语言的封装
    SQLAlchemy ORM核心的部分

    安装:

    lijuncheng@lijunchengdeMacBook-Pro ~ $ pip install SQLAlchemy
    Requirement already satisfied: SQLAlchemy in ./anaconda2/lib/python2.7/site-packages
    lijuncheng@lijunchengdeMacBook-Pro ~ $
    

    测试

    lijuncheng@lijunchengdeMacBook-Pro ~ $ python
    Python 2.7.13 |Anaconda custom (x86_64)| (default, Sep 21 2017, 17:38:20)
    [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sqlalchemy
    >>> sqlalchemy.__version__
    '1.1.13'
    

    4-3 ORM模型介绍

    sql 中的数据类型和 python中 SQLAlchemy是怎么样对应的呢?

    常见类型: Integer Float Boolean ForeignKe (外键) Date/DateTime String
    文档:http://docs.sqlalchemy.org/en/latest/core/

    一个模型对应一张表

    使用命令行创建表

    lijuncheng@lijunchengdeMacBook-Pro ~/Code/MySQL数据库 代码/实战网易新闻 $ python
    Python 2.7.13 |Anaconda custom (x86_64)| (default, Sep 21 2017, 17:38:20)
    [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from test_mysql_orm import News
    >>> from test_mysql_orm import engine
    >>> News.metadata.create_all(engine)      # 创建news表
    /Users/lijuncheng/anaconda2/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/base.py:1569: Warning: (1287L, "'@@tx_isolation' is deprecated and will be removed in a future release. Please use '@@transaction_isolation' instead")
      cursor.execute('SELECT @@tx_isolation')
    >>>
    

    4-4 新建ORM模型

    • ORM 链接数据库
    from sqlalchemy import create_engine
    engine = create_engine('mysql://root:admin123@localhost:3306/news_test?charset=utf8')
    
    • 模型声明(声明的class 都是继承他)
    from sqlalchemy.ext.declarative import declarative_base
    Base = declarative_base()
    
    • class需要使用到的数据类型
    from sqlalchemy import Column, Integer, String, DateTime, Boolean
    
    class News(Base):
        ''' 新闻类型 '''
        __tablename__ = 'news'
        id = Column(Integer, primary_key=True)
        title = Column(String(200), nullable=False)
        content = Column(String(2000), nullable=False)
        types = Column(String(10), nullable=False)
        image = Column(String(300))
        author = Column(String(20))
        view_count = Column(Integer)
        created_at = Column(DateTime)
        is_valid = Column(Boolean)
    
    • 创建表 帮我们把些sql的工作都完成了。
     News.metadata.create_all(engine)
    

    4-5 通过ORM新增数据到数据库

    from sqlalchemy.orm import sessionmaker
    Session = sessionmaker(bind=engine)
    
    class OrmTest(object):
    
        def __init__(self):
            self.session = Session()
    
        def add_one(self):
            ''' 添加数据 '''
            new_obj = News(
                title='ORM标题',
                content='content',
                types="百家"
            )
            self.session.add(new_obj)
            self.session.commit()
            return new_obj   # 每一个条记录都是一个class
    
    新增多条数据
    session.add_all([item1, item2, item3])
    

    4-6 通过ORM查询数据

    format 格式化

    def get_one(self):
            """  获取一条数据 """
            return self.session.query(News).get(13) # 查询id为1的数据
    
     测试获取一条数据
        rest = obj.get_one()  判断获取的数据是不是none
        if rest:
            print 'ID:{0} => {1}'.format(rest.id, rest.title) # 采用format的方式格式化
        else:
           print "No exist."
    
    
    def get_more(self):
            """  获取多条数据  """
            return self.session.query(News).filter_by(is_valid = True) # 查询没有删除的 即 is_valid =1
    
    rest = obj.get_more()
    print rest.count() # 答应查询的数据条数
    
    for row in obj.get_more():
           print(row.title)
    

    4-7 通过ORM修改删除数据

    以上三节的知识点记录在代码中

    # -- coding: utf-8 --
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Table, Column, Integer, String, DateTime, Boolean
    
    
    # 获取链接 Connecting
    # engine = create_engine('mysql://root:admin123@localhost:3306/news_test')
    # 插入中文出现错误解决
    engine = create_engine('mysql://root:admin123@localhost:3306/news_test?charset=utf8')
    
    # Declare a Mapping 
    # 获取基类
    Base = declarative_base()
    
    # 获取session对象
    Session = sessionmaker(bind = engine)
    
    #模型声明 
    class News(Base):   # Base 是 ORM的一个基类 ,也就是说News类继承自Base
        """ 新闻类 """
        __tablename__ = 'news'
        id = Column(Integer, primary_key = True)    # 若数据为news_id id = Column(Interger, primaty_key = True)
        title = Column(String(200), nullable = False)
        content = Column(String(2000), nullable = False)
        types = Column(String(10), nullable = False )
        image = Column(String(300))
        author = Column(String(20))
        view_count = Column(Integer)
        created_at = Column(DateTime)
        is_valid = Column(Boolean)
    """
    使用命令行创建表
    lijuncheng@lijunchengdeMacBook-Pro ~/Code/MySQL数据库 代码/实战网易新闻 $ python
    Python 2.7.13 |Anaconda custom (x86_64)| (default, Sep 21 2017, 17:38:20)
    [GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from test_mysql_orm import News
    >>> from test_mysql_orm import engine
    >>> News.metadata.create_all(engine)      # 创建news表
    /Users/lijuncheng/anaconda2/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/base.py:1569: Warning: (1287L, "'@@tx_isolation' is deprecated and will be removed in a future release. Please use '@@transaction_isolation' instead")
      cursor.execute('SELECT @@tx_isolation')
    >>>
    """
    class MySQLOrmTest(object):
    
        def __init__(self):
            self.session = Session()
    
        def add_one(self):
            """ 新增一条记录 """
            new_obj = News(
                title = '标题',
                content = '内容',
                types = '百家',
            )
    
            new_obj2 = News(
                title = 'title ',
                content = 'content ',
                types = '1',
            )
    
            self.session.add(new_obj)
            self.session.add(new_obj2)
    self.session.commit()
            return new_obj
    
        def get_one(self):
            """  获取一条数据 """
            return self.session.query(News).get(13) # 查询id为1的数据
    
        def get_more(self):
            """  获取多条数据  """
            return self.session.query(News).filter_by(is_valid = True) # 查询没有删除的 即 is_valid =1
    
        def update_data(self, pk):
            """ 修改单条数据 """
            new_obj = self.session.query(News).get(pk)
            if new_obj:
                new_obj.is_valid = 0
                self.session.add(new_obj)
    self.session.commit()
                return True
            return False  # 如果有数据就修改数据返回True,没有数据就直接返回False
    
        def update_data_more(self):
            """ 修改多条数据 """
            #data_list = self.session.query(News).filter_by(is_valid = False)
            data_list = self.session.query(News).filter(News.id >= 5)
            for item in data_list:
                item.is_valid = 1
                self.session.add(item)
    self.session.commit()
            pass
    
        def delete_data(self, pk):
            """ 删除单条数据  """
            # 获取删除的数据
            new_obj = self.session.query(News).get(pk)
            self.session.delete(new_obj)
    self.session.commit()
    
        def delete_data_more(self):
            """ 删除多条数据  """
            data_list = self.session.query(News).filter(News.id >= 5)
            for item in data_list:
                self.session.delete(item)
    self.session.commit()
            pass
    
    
    
    
    
    
    def main():
        obj = MySQLOrmTest()
    
        # 测试插入一条数据
        # rest = obj.add_one()
        # print rest.id
    
        # 测试获取一条数据
        # rest = obj.get_one()
        # if rest:
        #     print 'ID:{0} => {1}'.format(rest.id, rest.title) # 采用format的方式格式化
        # else:
        #     print "No exist."
    
        # 测试获取多条数据
        # rest = obj.get_more()
        # print rest.count() # 答应查询的数据条数
    
        # for new_obj in rest:
        #      print 'ID:{0} => {1}'.format(new_obj.id, new_obj.title)
        # pass
    
        # 测试修改数据代码
        # print obj.update_data(10)
    
        # # 测试多条数据修改代码
        # obj.update_data_more()
    
        # 测试删除数据代码
        # obj.delete_data(1)
    
        # 测试删除多条数据代码
        obj.delete_data_more()
        
    
    
    if __name__ == '__main__':
        main()
    """
    将每一条记录看成一个对象,ORM就是把数据库的记录转换为对象。
    ORM的实现:
        1.SqlObject
        2.peewee
        3.Django‘s ORM Django框架
        4.SQLAlchemy
    
        
    """
    

    第五章 网易新闻实战

    5-1 项目概述

    • fask框架 web网页
    • flask + SQLAlchemy

    flask英文文档:http://flask.pocoo.org/docs/0.11/
    flask中文文档:http://docs.jinkan.org/docs/flask/
    Flask-SQLAlchemy:http://flask-sqlalchemy.pocoo.org/2.1/

    flask 里面有一个微小的服务器,供我们调试使用。
    但是部署到服务器上不会用这个做,我们会用其他方式来做。
    因为它的并发,负载可定是不够的,只能满足开发的需求!

    部署服务器:tomcat 或者 ngix

    test_flask.py

    # -- coding: utf-8 --
    from flask import Flask
    app = Flask(__name__)  # 构造出一个app对象
    
    @app.route('/helle')  # 通过app路由 装饰器 用户访问到指定地址
    def hello_world(): # 然后把这个地址定义到一个方法中进行处理就好了。
        return 'Hello World helle !'
    """
    flask 里面有一个微小的服务器,供我们调试使用。
    但是部署到服务器上不会用这个做,我们会用其他方式来做。
    因为它的并发,负载可定是不够的,只能满足开发的需求!
    """
    if __name__ == '__main__':
        app.run(debug = True) # 用debug调试方式打开  按 cmd+s 保存的时候,服务器会自动重新启动。   将app运行起来。
    

    当写的网页找不到的适合,看看网址是不是有问题,例如出现在这样的问题 :@app.route('/helle')

    5-3 网页新闻框架搭建

    项目截图

    项目介绍:
    static 存放静态文件 JS JQuery CSS的图片
    templates 用来放模板文件
    模板文件继承其他模板文件
    flask_new.py flask程序,里面调用forms表单
    forms.py forms表单
    Bootstrap 在手机、 pc端 都有很好的展示效果 自适应调整 http://v3.bootcss.com/css/

    Utf8 字符
    Utf8mb4 中文字符+微信表情

    utf8mb4_general_ci
    错误:
    1.unexpected indent 字符对其

    2.ImportError: No module named sqlalchemy

    html也是有模版文件的

    Bootstrap 中小型企业的模版

    • 1
    app = Flask(__name__)
    # 配置数据库
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:ljc123456@localhost/mydatabase'
    # flaskSQLAlchemy
    db = SQLAlchemy(app)
    
    • 2
    # 继承的类 db = SSQLAlchemy(app)
    class News(db.Model):
        """ 新闻模型 """
        __tablename__ = 'news'
    
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(200), nullable=False)
        content = db.Column(db.String(2000), nullable=False)
        types = db.Column(db.Enum('推荐', '百家', '本地', '图片'))
        image = db.Column(db.String(200), nullable=False)
        author = db.Column(db.String(20))
        view_count = db.Column(db.Integer)
        created_at = db.Column(db.DateTime)
        is_valid = db.Column(db.Boolean, default=True)
    
        # print class对象的时候返回的是数据(新闻标题)、而不是地址。
        def __repr__(self):
            return '<News %r>' % self.title
    

    session不用声明flask已经全部封装好了。

    >>> from flask_news import db
    /Users/lijuncheng/anaconda2/lib/python2.7/site-packages/flask_sqlalchemy/__init__.py:794: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
      'SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and '
    >>> db.create_all()
    >>> db.create_all()
    /Users/lijuncheng/anaconda2/lib/python2.7/site-packages/sqlalchemy/dialects/mysql/base.py:1569: Warning: '@@tx_isolation' is deprecated and will be removed in a future release. Please use '@@transaction_isolation' instead
      cursor.execute('SELECT @@tx_isolation’)
    
    插入数据
    
    >>> from flask_news import News
    >>> new_obj = News(                    
                title = '标题',
                content = '内容',
                types = '百家',
            )
    ... ... ... ... >>> 
    >>> db.session.add(new_obj)
    >>> db.session.commit()
    
    查询数据
    
    >>> News.query.all()
    [<User u'u6807u9898'>]
    

    5-4 网易新闻前台

    给网页配置路由 也就是html文件。

    5-5 网易新闻后台管理首页及分页

    区别

    query.filter_by flter_by 可以使用 python 的正常参数传递方法传递条件,指定列名时,不需要额外指定类名。
    query.filter filter 可以像写 sql 的 where 条件那样写 > < 等条件,但引用列名时,需要通过 类名.属性名 的方式。
    query.get 一般都是去找主建
    filter_by: 用于查询简单的列名,不支持比较运算符
    filter比filter_by的功能更强大,支持比较运算符,支持or_、in_等语法

    5-6 网页新闻数据增加

    flask-wtf 制作表单
    安装:pip install Flask-WTF

    5-7 网易新闻数据修改

    5-8 网页新闻数据删除

    通过异部进行删除,先请求再删除

    整理要用的jquery的知识来使用ajax处理事件

    后面还要学习一些知识

    第6章 MongoDB 数据库基础

    6-1 mongoDb基础知识 (07:35)

    6-2 mongoDb安装和配置 (05:44)

    用homebrew下载安装

    启动:mongod

    • 新建数据文件存放地址
    • 启动mongodb数据库

    6-3 使用命令行操作数据库 (13:32)

    6-4 练习 (13:14)

    6-5 图形化管理工具 (04:33)

    第7章 Python操作MongoDB

    7-1 pymongo介绍和安装 (03:18)

    7-2 使用python连接数据库 (09:08)

    7-3 使用python新增数据到mongodb (07:53)

    7-4 使用python查询数据 (08:02)

    7-5 使用python修改数据 (06:01)

    7-6 使用python删除数据 (04:45)

    第8章 MongoDB ODM(1)

    8-1 MongoEngine的安装及连接 (06:00)

    8-2 ODM模型介绍 (11:46)

    第9章 MongoDB ODM(2)

    9-1 通过ODM查询数据 (12:02)

    9-2 通过ODM修改和删除数据 (09:03)

    9-3 通过ODM新增数据 (09:54)

    第10章 MongoDB 网易新闻实战

    10-1 实战项目简介及依赖安装 (04:10)

    10-2 新闻前台 (20:46)

    10-3 新闻后台首页及分页 (07:12)

    10-4 新闻数据的新增 (07:55)

    10-5 新闻数据的修改 (05:12)

    10-6 新闻数据的删除 (04:54)

    第11章 Redis数据库基础

    11-1 Redis介绍 (02:29)

    11-2 -Redis的安装 (03:30)

    11-3 -Sting类型相关操作 (09:22)

    11-4 -List 类型数据相关操作 (09:08)

    11-5 -Set类型相关操作 (04:53)

    11-6 -Hash类型相关操作 (08:10)

    11-7 -图形化管理工具 (04:30)

    第12章 python操作redis

    12-1 redis-py的安装和连接 (05:10)

    12-2 Python操作String类型相关命令 (09:22)

    12-3 Python操作List类型相关命令 (07:48)

    12-4 Python操作Set类型相关命令 (09:00)

    12-5 Python操作Hash类型相关命令 (08:33)

    第13章 python操作resis网易新闻实战

    13-1 实战项目介绍及分析 (05:23)

    13-2 实现新闻数据的新增 (13:35)

    13-3 新闻数据新增事务支持 (07:40)

    13-4 新闻数据首页 (10:50)

    13-5 新闻类别页和详情页 (08:20)

    13-6 后台首页及分页 (13:54)

    13-7 新闻数据的修改 (06:07)

    13-8 新闻数据的删除 (10:47)

  • 相关阅读:
    keep-alive的深入理解与使用(配合router-view缓存整个路由页面)
    vue无法自动打开浏览器
    解决vue页面刷新或者后退参数丢失的问题
    vue 跳转并传参,实现数据实时更新
    Struts2 有关于无法正常的使用通配符
    有关于java反编译工具的使用
    Action名称的搜索顺序
    Struts2 的 值栈和ActionContext
    在Action 中访问web资源
    oracle 创建database Link
  • 原文地址:https://www.cnblogs.com/JCcodeblgos/p/10331542.html
Copyright © 2011-2022 走看看