zoukankan      html  css  js  c++  java
  • day95 对数据库表的操作

    对数据库表的增

    models.py

    from sqlalchemy import create_engine
    from  sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy.orm import relationship
    from sqlalchemy import Column,Integer,String,Text,ForeignKey,DateTime,UniqueConstraint,Index
    Base = declarative_base()
    
    class Users(Base):
        __tablename__ ="users"
        id  = Column(Integer,primary_key=True)
        name  = Column(String(32),index=True,nullable=False,default="0")
        age = Column(Integer)
        #email = Column(String(32),unique=True)
    
        def __repr__(self):
            return self.name
    
    def init_db():
        '''
        通过类来创建表
        '''
        engine  = create_engine(#创建引擎
            #"mysql+pymysql://用户名:密码@ip:端口/库名?charset=字符集"
            # 1 用户名密码错误,用户权限不够,
            # 2 ip和端口不对。远程ip,该服务器的防火墙有没有关闭,端口不一定是3306,3307,3308,3309,3310
            "mysql+pymysql://root:@127.0.0.1:3306/python12?charset=utf8",
            max_overflow  = 0,
            pool_size =5,
            pool_timeout = 30,
            pool_recycle = -1
        )
        Base.metadata.create_all(engine)
    
    def del_db():
        '''
        根据类来删除
        '''
        engine = create_engine(
            "mysql+pymysql://root:@127.0.0.1:3306/python12?charset=utf8",
            max_overflow=0,
            pool_size=5,
            pool_timeout=30,
            pool_recycle=-1
        )
        Base.metadata.drop_all(engine)
    
    
    if __name__ == '__main__':
    
        # sqlalchemy是不支持改表的。
        init_db()
        #del_db()
    
    

    增.py

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from models import Users
    
    
    #创建引擎
    engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/python12", max_overflow=0, pool_size=5)
    # 绑定引擎 连接
    Connection=sessionmaker(bind=engine)
    
    #每次执行数据库操作是,都遇到创建一个Connection对象
    con=Connection()
    
    ################执行ORM操作######################
    obj1=Users(name="ojbk")
    con.add(obj1)
    #提交事务
    con.commit()
    
    #关闭session  其实是将连接放回连接池
    con.close()
    

    secop线程安全

    secop线程安全.py

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from sqlalchemy.orm import scoped_session
    from models import Users
    
    #创建引擎
    engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/python12", max_overflow=0, pool_size=5)
    # 绑定引擎 连接
    Session=sessionmaker(bind=engine)
    
    '''
    线程安全,基于本地线程实现每隔额线程用同一个session
    特殊性:scoped_session中有原来方法的Session的所有方法
    
    public_methods = (
        '__contains__', '__iter__', 'add', 'add_all', 'begin', 'begin_nested',
        'close', 'commit', 'connection', 'delete', 'execute', 'expire',
        'expire_all', 'expunge', 'expunge_all', 'flush', 'get_bind',
        'is_modified', 'bulk_save_objects', 'bulk_insert_mappings',
        'bulk_update_mappings',
        'merge', 'query', 'refresh', 'rollback',
        'scalar'
    )
    '''
    
    #scoped_session类并没有继承Session 但是却有他的所有方法
    session=scoped_session(Session)
    
    ###################执行ORM操作#################################
    obj1=Users(name="asdd")
    session.add(obj1)
    
    #提交事务
    session.commit()
    #关闭session
    session.close()
    

    单表的增删改查

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from models import Users
    
    #创建引擎
    engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/python12", max_overflow=0, pool_size=5)
    # 绑定引擎 连接
    Session=sessionmaker(bind=engine)
    
    #每次执行数据库操作是,都遇到创建一个Connection对象
    session=Session()
    
    # 增
    #方式一
    '''
    obj1=Users(name="tank")
    session.add(obj1)
    '''
    # 方式二
    '''
    session.add_all([
        Users(name="jsaon"),
        Users(name="egon"),
        #order(monery=10)
    ])
    '''
    
    
    #删
    '''session.query(Users).filter(Users.id==1).delete()
    '''
    
    #改
    '''
    session.query(Users).filter(Users.id==2).update({Users.name:"jdkdkdkdk"})
    session.query(Users).filter(Users.id==2).update({"name":"kdkdk"})
    '''
    '''
    类似于django中的F查询,但是必须要配合synchronize_session使用
    如果是字符串 就用synchronize_session=False
    如果是数字 就用synchronize_session="evaluate",可以不写 默认就是这个
    '''
    # session.query(Users).filter(Users.id==2).update({"name":Users.name+"hahah"},synchronize_session=False)
    # session.query(Users).filter(Users.id==2).update({Users.age:Users.age+123},synchronize_session="evaluate")
    
    # 所有的增删改都需要session.commit()
    '''
    session.commit()
    session.close()
    '''
    
    #查
    #打印SQL
    # r1=session.query(Users)
    
    #获取所有数据
    # r1=session.query(Users).all()
    
    #筛选,有两种 一种是filter  一种是filter_by
    #filter :传递的是表达式
    # filter_by :传递的是参数
    
    r1=session.query(Users).filter(Users.id>3).all()
    r2=session.query(Users).filter_by(name="tank").all()
    print(r1)
    print(r2)
    

    单表的高级查询

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from models import Users
    
    #创建引擎
    engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/python12", max_overflow=0, pool_size=5)
    # 绑定引擎 连接
    Session=sessionmaker(bind=engine)
    
    #每次执行数据库操作是,都遇到创建一个Connection对象
    session=Session()
    
    # 条件查询
    ret=session.query(Users).filter_by(name="tank").all()
    
    # 表达式 and条件连接
    ret=session.query(Users).filter(Users.name=="jason",Users.age>2).all()
    
    #between查询
    ret=session.query(Users).filter(Users.id.between(3,5)).all()
    
    # in查询
    ret=session.query(Users).filter(Users.id.in_([3,4,5,6])).all()
    
    # 取反
    ret=session.query(Users).filter(~Users.id.in_([3,4,5,6])).all()
    
    # or与and
    from sqlalchemy import and_,or_
    
    # ret=session.query(Users).filter(and_(Users.id>5,Users.name=="jason")).all()
    ret=session.query(Users).filter(
        and_(
            or_(Users.name=="jason",Users.name=="tank"),
            Users.id==6
        )
    ).all()
    
    
    #like查询
    ret=session.query(Users).filter(Users.name.like("j%")).all()#以j开头
    ret=session.query(Users).filter(Users.name.like("_a%")).all()#第二个是a
    
    #排序
    #从大到小
    ret=session.query(Users).order_by(Users.id.desc()).all()
    #从小到大
    ret=session.query(Users).order_by(Users.id.asc()).all()
    
    #多标准排序
    ret=session.query(Users).order_by(Users.age.asc(),Users.id.desc()).all()
    
    
    #分组
    ret=session.query(Users).group_by(Users.age).all()
    
    from sqlalchemy.sql import func
    ret=session.query(
        func.max(Users.id),
        func.sum(Users.id),
        func.min(Users.id)
    ).group_by(Users.age).all()
    
    #二次条件
    ret=session.query(
        func.max(Users.id),
        func.sum(Users.id),
        func.min(Users.id)
    ).group_by(Users.age).having(func.min(Users.id)>5).all()
    print(ret)
    

    一对多

    models.py

    #一个爱好,可以被多个人喜欢。
    class Hobby(Base):
        __tablename__ = 'hobby'
        id = Column(Integer, primary_key=True)
        caption = Column(String(50), default='篮球')
    
    
    class Person(Base):
        __tablename__ = 'person'
        nid = Column(Integer, primary_key=True)
        name = Column(String(32), nullable=True)
        # hobby指的是tablename而不是类名,uselist=False 外键
        hobby_id = Column(Integer, ForeignKey("hobby.id"))
    
        # 跟数据库无关,不会新增字段,只用于快速链表操作 类似于虚拟字段
        # 类名,backref用于反向查询
        hobby = relationship('Hobby', backref='pers')
    

    一对多.py

    import time
    import threading
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
    from sqlalchemy.orm import sessionmaker, relationship
    from sqlalchemy import create_engine
    from sqlalchemy.sql import text
    from sqlalchemy.engine.result import ResultProxy
    from models import Users,Hobby, Person
    
    #创建引擎
    engine=create_engine("mysql+pymysql://root:@127.0.0.1:3306/python12", max_overflow=0, pool_size=5)
    # 绑定引擎 连接
    Session=sessionmaker(bind=engine)
    
    #每次执行数据库操作是,都遇到创建一个Connection对象
    session=Session()
    
    # 增
    # session.add_all([
    #     Hobby(caption="洗澡"),
    #     Hobby(caption="洗脚"),
    #     Person(name="甲",hobby_id=1),
    #     Person(name="乙",hobby_id=2)
    # ])
    
    # per=Person(name="丙",hobby=Hobby(caption="搓背"))
    # per=Person(name="丙",hobby_id=1)
    # session.add(per)
    
    # ho=Hobby(caption="按摩")
    # ho.pers=[Person(name="丁"),Person(name="戊")]
    # session.add(ho)
    # #
    # session.commit()
    # session.close()
    
    # 查
    person_list=session.query(Person).all()
    print(person_list[0].name,person_list[0].hobby.caption)
    
    hob=session.query(Hobby).filter(Hobby.id==5).first()
    print(hob.id)
    print(hob.pers[0].name)
    

    多对多

    models.py

    class Boy2Girl(Base):
        __tablename__ = 'boy2girl'
        id = Column(Integer, primary_key=True, autoincrement=True)
        girl_id = Column(Integer, ForeignKey('girl.id'))
        boy_id = Column(Integer, ForeignKey('boy.id'))
    
    
    class Girl(Base):
        __tablename__ = 'girl'
        id = Column(Integer, primary_key=True)
        name = Column(String(64), unique=True, nullable=False)
    
    
    class Boy(Base):
        __tablename__ = 'boy'
    
        id = Column(Integer, primary_key=True, autoincrement=True)
        name = Column(String(64), unique=True, nullable=False)
    
        # 与生成表结构无关,仅用于查询方便,放在哪个单表中都可以
        girl = relationship('Girl', secondary='boy2girl', backref='boys')
    

    多对多.py

    from sqlalchemy.orm import sessionmaker
    from sqlalchemy import create_engine
    from models import Girl,Boy,Boy2Girl
    
    engine = create_engine("mysql+pymysql://root:@127.0.0.1:3306/python12?charset=utf8", max_overflow=0, pool_size=5)
    Session = sessionmaker(bind=engine)
    session = Session()
    
    # 增
    # session.add_all([
    #     Girl(name="苍"),
    #     Girl(name="玛"),
    #     Boy(name="甲"),
    #     Boy(name="乙")
    # ])
    # b2g=Boy2Girl(girl_id=1,boy_id=1)
    # session.add(b2g)
    
    # 关联增加
    # boy1=Boy(name="丁")
    # boy1.girl=[Girl(name="风"),Girl(name="真")]
    # session.add(boy1)
    
    # gir=Girl(name="郭")
    # gir.boys=[Boy(name="李易峰"),Boy(name="彭于晏")]
    # session.add(gir)
    # session.commit()
    # session.close()
    
    #正向查询
    boys=session.query(Boy).first()
    print(boys.name)
    print(boys.girl[0].name)
    
    girls=session.query(Girl).filter(Girl.id==6).first()
    print(girls.name)
    print(girls.boys[0].name,girls.boys[1].name)
    
    

    pro_flask_sansa

    pip install flask-sqlalchemy

    pip install flask-migrate

    python manage.py db init 初始化:只执行一次
    python manage.py db migrate 等同于 makemigartions
    python manage.py db upgrade 等同于migrate

    -sansa
    	--views
        	---account.py
        --__init__.py
        --models.py
    -manage.py
    -settings.py
    

    account.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    from flask import Blueprint
    from .. import db
    from .. import models
    
    account = Blueprint('account', __name__)
    
    
    @account.route('/login')
    def login():
        db.session.add(models.Users(username='lqz', email='123'))
    
        db.session.commit()
        tt = db.session.query(models.Users).all()
        print(tt[0].username)
        # 添加示例
        """
        db.session.add(models.Users(username='lqz', pwd='123', gender=1))
        db.session.commit()
    
        obj = db.session.query(models.Users).filter(models.Users.id == 1).first()
        print(obj)
    
        PS: db.session和db.create_session
        """
        # db.session.add(models.Users(username='wupeiqi1', email='wupeiqi1@xx.com'))
        # db.session.commit()
        # db.session.close()
        #
        # db.session.add(models.Users(username='wupeiqi2', email='wupeiqi2@xx.com'))
        # db.session.commit()
        # db.session.close()
        # db.session.add(models.Users(username='alex1',email='alex1@live.com'))
        # db.session.commit()
        # db.session.close()
    
    
    
        # user_list = db.session.query(models.Users).all()
        # db.session.close()
        # for item in user_list:
        #     print(item.username)
    
    
        return 'login'
    
    

    init.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    
    from .models import *
    from .views import account
    
    def create_app():
        app = Flask(__name__)
        app.config.from_object('settings.DevelopmentConfig')
    
        # 将db注册到app中
        db.init_app(app)
    
        # 注册蓝图
        app.register_blueprint(account.account)
    
    
        return app
    
    

    models.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    from . import db
    
    
    class Users(db.Model):
        """
        用户表
        """
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        username = db.Column(db.String(80), unique=True, nullable=False)
        email = db.Column(db.String(120), unique=True, nullable=False)
        # ids = db.Column(db.Integer)
    
        def __repr__(self):
            return '<User %r>' % self.username
    
    

    manage.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    """
    生成依赖文件:
        pipreqs ./
    
    """
    from sansa import create_app
    from flask_script import Manager
    from flask_migrate import Migrate,MigrateCommand
    from sansa import db
    app = create_app()
    manager=Manager(app)
    
    Migrate(app,db)
    manager.add_command('db', MigrateCommand)
    
    if __name__ == '__main__':
        # app.run()
        manager.run()
    
    

    settings.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    class BaseConfig(object):
        # SESSION_TYPE = 'redis'  # session类型为redis
        # SESSION_KEY_PREFIX = 'session:'  # 保存到session中的值的前缀
        # SESSION_PERMANENT = True  # 如果设置为False,则关闭浏览器session就失效。
        # SESSION_USE_SIGNER = False  # 是否对发送到浏览器上 session:cookie值进行加密
    
        SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:@127.0.0.1:3306/python12?charset=utf8"
        SQLALCHEMY_POOL_SIZE = 5
        SQLALCHEMY_POOL_TIMEOUT = 30
        SQLALCHEMY_POOL_RECYCLE = -1
    
        # 追踪对象的修改并且发送信号
        SQLALCHEMY_TRACK_MODIFICATIONS = False
    
    
    class ProductionConfig(BaseConfig):
        pass
    
    
    class DevelopmentConfig(BaseConfig):
        pass
    
    
    class TestingConfig(BaseConfig):
        pass
    
    
  • 相关阅读:
    PHP配置文件处理类
    PHP中实现图片上传的类库
    在PHP中实现StringBuilder类
    微软官方及第三方SDK http://msdn.microsoft.com/zhcn/jj923044
    在PHP中模拟asp的response类
    Atitit.并发测试解决方案(2) 获取随机数据库记录 随机抽取数据 随机排序 原理and实现
    atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制
    atitit.二进制数据无损转字符串网络传输
    atitit.重装系统需要备份的资料总结 o84..
    atitit.web ui 结构建模工具总结
  • 原文地址:https://www.cnblogs.com/zqfzqf/p/12392266.html
Copyright © 2011-2022 走看看