zoukankan      html  css  js  c++  java
  • python ORM

    python操作数据库

    使用 ORM - sqlalchemy,pymsql

    安装:

    pip install pymsq
    pip install sqlalchemy

    一、 '''连接数据库'''

     '''导入必须的包'''
    from
    sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker
    # 基本设置 
    HOSTNAME = '127.0.0.1'   # 本地 liunx
    POST = '3306'            # mysql 默认端口
    DATABASE = 'mydb'        # 数据库名字
    USERNAME = 'admin'       # 用户名
    PASSWORD = 'Root110qwe'  # 密码
    # 固定写法
    db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( USERNAME, PASSWORD, HOSTNAME, POST, DATABASE )
    # 这里的 db_url 就是连接数据库的路径。“mysql+mysqldb”指定了使用 MySQL-Python 来连
    engine = create_engine(db_url,echo=False)   # 初始化数据库连接, 
    # create_engine() 会返回一个数据库引擎,echo 参数为 True 时,会显示每条执行的 SQL 语句,生产环境下可关闭。
    Base = declarative_base(engine) # 创建对象的基类
    Session = sessionmaker(engine) # 创建与数据库连接的Session类
    session = Session() # session可以视为数据库连接
    # sessionmaker() 会生成一个数据库会话类。这个类的实例可以当成一个数据库连接,它同时还记录了一些查询的数据,并决定什么时候执行 SQL 语句。
    if __name__ == '__main__':  # 测试是否连接成功
        connection = engine.connect()
        result = connection.execute('select 1')
        print(result.fetchone())



    二 、 '''创建 类—表 映射关系'''

         创建表的同时,也映射数据库;也可以单独创建表,

    # -*- coding:utf-8 -*-
    
    from datetime import datetime
    from sqlalchemy import Column,Integer,String,DateTime 
    from connect import Base,session # 这里connect前面加上点之后 不能直接执行文件,但是可以外部调用
    
    
    '''创建表 user '''
    class User(Base):
    
        __tablename__ = 'user'
        id = Column(Integer,primary_key=True,autoincrement=True) #主键 ,自增长
        username = Column(String(20),nullable=False) # 用户名长度 20 、非空
        password = Column(String(50)) # 密码长度 50
        creatime = Column(DateTime,default=datetime.now) # 创建时间
    
        @classmethod
        def by_name(cls,name): # 定义查询函数,返回查询结果
            return session.query(cls).filter(cls.username==name).first()
    
        def __repr__(self): # 重写repr 便于阅读
            return "<User(id=%s,username%s,password=%s,createtime=%s)>" % (
                self.id,
                self.username,
                self.password,
                self.creatime
            )
    
    from sqlalchemy.orm import relationship
    from sqlalchemy import ForeignKey
    
    
    '''创建表 user_details '''
    class UserDetails(Base):
    
        __tablename__='user_details'
        id = Column(Integer, primary_key=True, autoincrement=True)
        id_card = Column(Integer,nullable=True,unique=True)
        lost_login = Column(DateTime)
        login_num = Column(Integer,default=0)
        user_id = Column(Integer,ForeignKey('user.id'))
    
        '''
        User 要关联的表的名字
        backref 返回 details 方法(属性)
        uselist 默认为True, 表示一对多关系(False表示一对一)
        cascade 自动处理关系 相当于mysql中的ON DELETE 类似 有 7 个可选参数
        在代码层控制
        '''
        userdetail = relationship('User',backref='details',uselist=False,cascade='all')
    
        def __repr__(self):  # 重写repr 便于阅读
            return '<UserDetails(id=%s,id_card=%s,last_login=%s,login_num=%s,user_id=%s)>'%(
                self.id,
                self.id_card,
                self.lost_login,
                self.login_num,
                self.user_id
            )
    
    
    from sqlalchemy import  Table
    
    ''' 创建表的另一种方法 这种方法没有映射,如果需要映射 还需重新创建 类,重写 repr'''
    user_article = Table('user_article',Base.metadata,
         Column('user_id',Integer,ForeignKey('user.id'),primary_key=True),
         Column('article_id',Integer,ForeignKey('article.id'),primary_key=True)
     )


    '''创建表 article '''
    class Article(Base):
    
        __tablename__ = 'article'
        id = Column(Integer,primary_key=True,autoincrement=True)
        content = Column(String(50),nullable=True)
        create_time = Column(DateTime,default=datetime.now())
    
        article_user = relationship('User',backref='article',secondary=user_article)# 创建映射关系
    
        def __repr__(self):  # 重写repr 便于阅读
            return  'Article(id=%s,content=%s,create_time=%s)'%(
                self.id,
                self.content,
                self.create_time
            )
    
    
    if __name__ == '__main__':
        Base.metadata.create_all() # 执行

    三 、 '''简单的 增、删、查、改 操作 '''

    # -*- coding:utf-8 -*-
    from connect import session
    from user_module import User
    
    def add_user(): #
        # persson = User(username='xiaohong',password='qwe123',id=1)
        # session.add(persson)  # 提交单条数据
    
        # 一次提交多条数据 , 注意 这里 all 里面是列表
        session.add_all(
            [
            User(username='小红', password='qwe123mmm'),
            User(username='老王', password='12345nnnnn'),
            User(username='小明', password='654321hhhhh'),
            ]
        )
        session.commit() # 必须提交
    
    def search_user(): # 查询 默认repr 便于机器阅读,需要重写
        rows = session.query(User).all()
        print(rows)
    
    def update_user(): #
        session.query(User).filter(User.id==2).update({User.password:1})
        session.commit()
    
    def delete_user(): # 删除
        # rows = session.query(User).filter(User.id==2)[0]
        rows = session.query(User).all()
        print(rows)
        for i in rows: # 如果查到的数据量大,就是用循环删除 
            session.delete(i)
        session.commit()
    
    
    if __name__ == '__main__':
        add_user()
        # search_user()
        # delete_user()
        # update_user()

    推荐文章:廖雪峰的  使用SQLAlchemy 

           脚本之家的   Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)

           z+j  的  Python SqlAlchemy使用方法

          K.TakanashiSQLAlchemy的初步使用 

         SQLAlchemy入门(一)

  • 相关阅读:
    操作系统原理
    Linux三剑客正则表达式
    Linux通配符知识深度实践详解
    Linux文件属性之时间戳及文件名知识详解
    Linux系统文件权限
    date:显示与设置系统时间
    正则表达式--三剑客简单应用
    Linux习题小结
    Linux系统文件属性知识
    Linux系统目录结构知识
  • 原文地址:https://www.cnblogs.com/zlsgh/p/8538911.html
Copyright © 2011-2022 走看看