zoukankan      html  css  js  c++  java
  • SQLAlchemy学习

    www.cnblogs.com/alex3714/articles/5978329.html

    1. ORM介绍

    orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似python这种面向对象的程序来说一切皆对象,但是我们使用的数据库却都是关系型的,为了保证一致的使用习惯,通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。

    orm的优点:

    1. 隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
    2. ORM使我们构造固化数据结构变得简单易行。

    缺点:

    1. 无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。

    2. sqlalchemy安装

    在Python中,最有名的ORM框架是SQLAlchemy。用户包括openstack\Dropbox等知名公司或应用,主要用户列表http://www.sqlalchemy.org/organizations.html#openstack

    Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作,如:

    MySQL-Python
        mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
       
    pymysql
        mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
       
    MySQL-Connector
        mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
       
    cx_Oracle
        oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]
       
    更多详见:http://docs.sqlalchemy.org/en/latest/dialects/index.html
    

      安装sqlalchemy

    pip install SQLAlchemy
    pip install pymysql  #由于mysqldb依然不支持py3,所以这里我们用pymysql与sqlalchemy交互

    3.sqlalchemy基本使用

    下面我们创建一个表是这样的

    CREATE TABLE user (
        id INTEGER NOT NULL AUTO_INCREMENT,
        name VARCHAR(32),
        password VARCHAR(64),
        PRIMARY KEY (id)
    )
    import sqlalchemy
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String
     
    engine = create_engine("mysql+pymysql://root:alex3714@localhost/testdb",
                                        encoding='utf-8', echo=True)
     
     
    Base = declarative_base() #生成orm基类
     
    class User(Base):
        __tablename__ = 'user' #表名
        id = Column(Integer, primary_key=True)
        name = Column(String(32))
        password = Column(String(64))
     
    Base.metadata.create_all(engine) #创建表结构
    

      除上面的创建之外,还有一种创建表的方式,虽不常用,但还是看看吧

    from sqlalchemy import Table, MetaData, Column, Integer, String, ForeignKey
    from sqlalchemy.orm import mapper
     
    metadata = MetaData()
     
    user = Table('user', metadata,
                Column('id', Integer, primary_key=True),
                Column('name', String(50)),
                Column('fullname', String(50)),
                Column('password', String(12))
            )
     
    class User(object):
        def __init__(self, name, fullname, password):
            self.name = name
            self.fullname = fullname
            self.password = password
     
    mapper(User, user) #the table metadata is created separately with the Table construct, then associated with the User class via the mapper() function
    View Code

    事实上,我们用第一种方式创建的表就是基于第2种方式的再封装。

    最基本的表我们创建好了,那我们开始用orm创建一条数据试试

    Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
    Session = Session_class() #生成session实例
     
     
    user_obj = User(name="Jack",password="123") #生成你要创建的数据对象
    print(user_obj.name,user_obj.id)  #此时还没创建对象呢,不信你打印一下id发现还是None
     
    Session.add(user_obj) #把要创建的数据对象添加到这个session里, 一会统一创建
    print(user_obj.name,user_obj.id) #此时也依然还没创建
     
    Session.commit() #现此才统一提交,创建数据



      1 #!/usr/bin/env python3
      2 #-*- coding:utf-8 -*-
      3 '''
      4 Administrator 
      5 2018/11/8 
      6 '''
      7 import sqlalchemy
      8 from sqlalchemy import create_engine
      9 from sqlalchemy.ext.declarative import declarative_base
     10 from sqlalchemy import Column, Integer, String,Time,Enum,ForeignKey,DateTime
     11 from sqlalchemy.orm import sessionmaker,relationship
     12 
     13 engine = create_engine("mysql+pymysql://root:ss@123@localhost/kaige",
     14                        encoding='utf-8')# echo=True
     15 
     16 Base = declarative_base()  # 生成orm基类
     17 
     18 
     19 class User(Base):
     20     __tablename__ = 'user'  # 用户
     21     id = Column(Integer, primary_key=True) #不能为空  int
     22     name = Column(String(32),nullable=False)     #不能为空
     23     password = Column(String(64),nullable=False)  #不能为空
     24     gender=Column(Enum("M","F"),default="M")
     25 
     26 
     27 class Project(Base):
     28     __tablename__ = 'project'  # 工程列表
     29     id = Column(Integer, primary_key=True)
     30     name = Column(String(32),nullable=False)    #不能为空
     31     ctime = Column(DateTime, nullable=False)  # 创建时间  datetime.datetime
     32     user_id = Column(Integer,ForeignKey("user.id"))  # 修改人员   要用外键连接
     33 
     34     user=relationship("User",backref="my_project") #
     35 
     36     def __repr__(self):
     37         return "<%s  %s  %s    %s>"%(self.id,self.name,self.ctime,self.user.name)
     38 
     39 
     40 class Edition(Base):
     41     __tablename__='edition' #版本控制
     42     id = Column(Integer, primary_key=True) #不能为空
     43     name=Column(String(32))#版本名称  不能为空
     44     stime = Column(DateTime,nullable=False)  # 最近一次修改保存时间  datetime.datetime
     45     project_id = Column(Integer,ForeignKey("project.id")) #对应的版本控制  要用外键连接   不能为空
     46 
     47 
     48 
     49 class Statistics(Base):#概算表构件名称# 概算统计表主表
     50     __tablename__ = 'statistics'  # 概算统计表主表
     51     id = Column(Integer, primary_key=True)#主键
     52     num = Column(Integer)  # 序号  可以为空
     53     name = Column(String(32),nullable=False)    #构件名称  不能为空
     54     count = Column(String(32))  #数量 可以为空
     55     size=Column(String(32))     #基本尺寸,可以为空
     56     edition_id = Column(Integer, ForeignKey("edition.id"))  # 对应的版本控制  要用外键连接   不能为空
     57 
     58 class Items(Base):  #概算统计表主表
     59     __tablename__ = 'items'
     60     id = Column(Integer, primary_key=True)#主键
     61     itemName = Column(String(64))    #概算项目 可以为空
     62     quota = Column(String(32))  #概算定额号 可以为空
     63     quantities=Column(String(32))     #工程量 可以为空
     64     unit=Column(String(32))     #单位  可以为空
     65     statistics_id=Column(Integer,ForeignKey("statistics.id"))
     66 
     67 Base.metadata.create_all(engine)  # 创建表结构
     68 
     69 Session_class = sessionmaker(bind=engine) #创建与数据库的会话session class ,注意,这里返回给session的是个class,不是实例
     70 Session = Session_class() #生成session实例
     71 
     72 u1=User(name="admin",password="123")
     73 u2=User(name="admin1",password="123",gender="F")
     74 u3=User(name="admin2",password="123")
     75 u4=User(name="admin3",password="123",gender="F")
     76 import datetime
     77 p1=Project(name="project111111",user_id=1,ctime=datetime.datetime.now())
     78 p2=Project(name="project222222",user_id=1,ctime=datetime.datetime.now())
     79 p3=Project(name="project333333",user_id=2,ctime=datetime.datetime.now())
     80 p4=Project(name="project444444",user_id=3,ctime=datetime.datetime.now())
     81 
     82 e1=Edition(name="v0.01",stime=datetime.datetime.now(),project_id=1)
     83 e2=Edition(name="v0.02",stime=datetime.datetime.now(),project_id=1)
     84 e3=Edition(name="v0.03",stime=datetime.datetime.now(),project_id=1)
     85 e4=Edition(name="v0.01",stime=datetime.datetime.now(),project_id=2)
     86 
     87 s1=Statistics(num=1,name="goujian001",count=1,edition_id=1)
     88 s2=Statistics(num=2,name="goujian002",count=1,edition_id=1)
     89 s3=Statistics(num=3,name="goujian003",count=1,edition_id=1)
     90 s4=Statistics(num=1,name="goujian001",count=1,edition_id=2)
     91 s5=Statistics(num=2,name="goujian002",count=1,edition_id=2)
     92 s6=Statistics(num=3,name="goujian003",count=1,edition_id=2)
     93 s7=Statistics(num=1,name="goujian001",count=1,edition_id=3)
     94 
     95 i1=Items(itemName="item01",statistics_id=1)
     96 i2=Items(itemName="item02",statistics_id=1)
     97 i3=Items(itemName="item03",statistics_id=2)
     98 i4=Items(itemName="item04",statistics_id=2)
     99 i5=Items(itemName="item05",statistics_id=2)
    100 
    101 # Session.add_all([u1,u2,u3,u4,p1,p2,p3,p4,e1,e2,e3,e4,s1,s2,s3,s4,s5,s6,s7,i1,i2,i3,i4,i5])
    102 # Session.add_all([i1,i2,i3,i4,i5])
    103 # Session.commit()
    104 
    105 user_obj=Session.query(User).filter(User.name=="admin").first()
    106 print(user_obj.my_project)

    结果:

    F:DMDataMvenvScriptspython.exe F:/DM/DataM/db/data_m_db.py
    [<1  project111111  2018-11-08 13:43:46    admin>, <2  project222222  2018-11-08 13:43:46    admin>]
    
    Process finished with exit code 0
    

      

  • 相关阅读:
    数组排序去重
    js打印页面添加分页
    使用navicate可视化工具连接mysql数据库错误
    php_smarty模板引擎与.NET_VTemplate模板引擎对比
    JoshChen判断是否微信内置浏览器访问【转载】
    JoshChen毕业设计分享之班级网站-ASP.NET
    JoshChen防止前台恶意修改数据
    JoshChen安卓开发学习,从零开始(2)
    JoshChen安卓开发学习,从零开始(1)
    JoshChen模式笔记之php单例模式
  • 原文地址:https://www.cnblogs.com/Mengchangxin/p/9927243.html
Copyright © 2011-2022 走看看