zoukankan      html  css  js  c++  java
  • mysql数据库

    mysql数据库

    1. 安装

    1. 安装mysqldb
    2. pip install sqlalchemy

    2. 连接

    # -*- coding: utf-8 -*-
    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    engine = create_engine('mysql://user:passwd@ip:port/test', echo=True)
    Session = sessionmaker(bind=engine)
    
    session = Session()
    session.execute('show databases')
    
    

    其中,echo为True代表打开logging,test为数据库名。

    3. 创建映射

    一个映射对应着一个Python类,用来表示一个表的结构。下面创建一个person表,包括id和name两个字段。

    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()#基类?
    
    class Person(Base):
        __tablename__ = 'person'
    
        id   = Column(Integer, primary_key=True)
        name = Column(String(32))
    
        def __repr__(self):
            return "<Person(name='%s')>" % self.name
    

    其中id是主键

    主键,外键

    4. 添加数据

    4.1 添加一条数据

    #创建一个person对象
    person = Person(name='jack')
    #添加person对象,但是仍然没有commit到数据库
    session.add(person)
    #commit操作
    session.commit()
    

    4.2 如何获取id的?

    • 将person对象commit到mysql后才可以获取到id:
    person = Person(name='ilis')
    session.add(person)
    session.commit()
    person.id
    

    4.3 添加多个数据

    session.add_all([
        Person(name='jack'),
        Person(name='mike')
    ])
    session.commit()
    

    5. 数据查询

    使用Session的query()方法

    #获取所有数据
    session.query(Person).all()
    
    #获取某一列数据,类似于django的get,如果返回数据为多个则报错
    session.query(Person).filter(Person.name=='jack').one()
    
    #获取返回数据的第一行
    session.query(Person).first()
    
    #过滤数据
    session.query(Person.name).filter(Person.id>1).all()
    
    #limit
    session.query(Person).all()[1:3]
    
    #order by
    session.query(Person).ordre_by(-Person.id)
    
    #equal/like/in
    query = session.query(Person)
    query.filter(Person.id==1).all()
    query.filter(Person.id!=1).all()
    query.filter(Person.name.like('%ac%')).all()
    query.filter(Person.id.in_([1,2,3])).all()
    query.filter(~Person.id.in_([1,2,3])).all()
    query.filter(Person.name==None).all()
    
    #and or
    from sqlalchemy import and_
    query.filter(and_(Person.id==1, Person.name=='jack')).all()
    query.filter(Person.id==1, Person.name=='jack').all()
    query.filter(Person.id==1).filter(Person.name=='jack').all()
    from sqlalchemy import or_
    query.filter(or_(Person.id==1, Person.id==2)).all()
    

    其中, session.query(Person).all() 中Person是要指定查询的表, .all()表示查询该表的所有数据。

    计数

    • Query使用count()函数来实现查询计数。
    query = session.query(Person)
    query.filter(Person.id>1).count()
    

    6. 数据删除

    session.delete(jack)
    

    7. 创建数据表

    CREATE TABLE table_name (column_name column_type);
    

    以下例子中我们将在 RUNOOB 数据库中创建数据表runoob_tbl:

    CREATE TABLE IF NOT EXISTS `runoob_tbl`(
       `runoob_id` INT UNSIGNED AUTO_INCREMENT,
       `runoob_title` VARCHAR(100) NOT NULL,
       `runoob_author` VARCHAR(40) NOT NULL,
       `submission_date` DATE,
       PRIMARY KEY ( `runoob_id` )
    )ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    解析:

    = 如果你不想字段为 NULL 可以设置字段的属性为 NOT NULL, 在操作数据库时如果输入该字段的数据为NULL ,就会报错。

    • AUTO_INCREMENT定义列为自增的属性,一般用于主键,数值会自动加1。
    • PRIMARY KEY关键字用于定义列为主键。 您可以使用多列来定义主键,列间以逗号分隔。
    • ENGINE 设置存储引擎,CHARSET 设置编码。

    8. 删除数据表

    DROP TABLE table_name ;
    

    8.1 删除表内数据,用 delete。

    delete from 表名 where 删除条件;
    

    例:

    delete from  student where  T_name = "张三";
    

    8.2 清除表内数据,保存表结构,用 truncate。

    truncate table 表名;
    

    例:清除学生表内的所有数据。

    truncate  table  student;
    
    

    8.3 删除表用 drop,就是啥都没了

    drop  table  表名;
    

    例:

    drop table student;
    
    

    ps:

    1. 当你不再需要该表时, 用 drop;
    2. 当你仍要保留该表,但要删除所有记录时, 用 truncate;
    3. 当你要删除部分记录时, 用 delete。
    4. delete 操作以后,使用 optimize table table_name 会立刻释放磁盘空间,不管是 innodb 还是 myisam;
    5. delete from 表以后虽然未释放磁盘空间,但是下次插入数据的时候,仍然可以使用这部分空间。
    delete from student where T_name = "张三";
    optimize table student;
    

    使用SQLAlchemy

    数据库表是一个二维表,包含多行多列。把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含id和name的user表:

    [
        ('1', 'Michael'),
        ('2', 'Bob'),
        ('3', 'Adam')
    ]
    

    即 每个元祖是一行记录。

    Python的DB-API返回的数据结构就是像上面这样表示的。

    但是用tuple表示一行很难看出表的结构。如果把一个tuple用class实例来表示就可以更容易地看出表的结构来:

    class实例表示表

    如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:

    class User(object):
        def __init__(self, id, name):
            self.id = id
            self.name = name
    
    [
        User('1', 'Michael'),
        User('2', 'Bob'),
        User('3', 'Adam')
    ]
    

    这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。

    • 在Python中,最有名的ORM框架是SQLAlchemy。我们来看看SQLAlchemy的用法。

    安装:easy_install sqlalchemy

    使用:

    # 导入:
    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    
    # 创建对象的基类:
    Base = declarative_base()
    
    # 定义User对象:
    class User(Base):
        # 表的名字:
        __tablename__ = 'user'
    
        # 表的结构:
        id = Column(String(20), primary_key=True)
        name = Column(String(20))
    
    # 初始化数据库连接:
    engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
    # 创建DBSession类型:
    DBSession = sessionmaker(bind=engine)
    

    以上代码完成SQLAlchemy的初始化和具体每个表的class定义。如果有多个表,就继续定义其他class,例如School:

    class School(Base):
        __tablename__ = 'school'
        id = ...
        name = ...
    
    • create_engine()用来初始化数据库连接。SQLAlchemy用一个字符串表示连接信息:

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

    由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象:

    # 创建session对象:
    session = DBSession()
    # 创建新User对象:
    new_user = User(id='5', name='Bob')
    # 添加到session:
    session.add(new_user)
    # 提交即保存到数据库:
    session.commit()
    # 关闭session:
    session.close()
    
    • 可见,关键是获取session,然后把对象添加到session,最后提交并关闭。Session对象可视为当前数据库连接。
    • 如何从数据库表中查询数据呢?有了ORM,查询出来的可以不再是tuple,而是User对象。SQLAlchemy提供的查询接口如下:
    # 创建Session:
    session = DBSession()
    # 创建Query查询,filter是where条件,最后调用one()返回唯一行,如果调用all()则返回所有行:
    user = session.query(User).filter(User.id=='5').one()
    # 打印类型和对象的name属性:
    print 'type:', type(user)
    print 'name:', user.name
    # 关闭Session:
    session.close()
    

    运行结果:

    type: <class '__main__.User'>
    name: Bob
    
    • 可见,ORM就是把数据库表的行与相应的对象建立关联,互相转换。

    • 由于关系数据库的多个表还可以用外键实现一对多、多对多等关联,相应地,ORM框架也可以提供两个对象之间的一对多、多对多等功能。

    • 例如,如果一个User拥有多个Book,就可以定义一对多关系如下:

    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'))
    

    当我们查询一个User对象时,该对象的books属性将返回一个包含若干个Book对象的list。

    主键 外键

    数据库中的一条记录中有若干个属性,**若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 **

    比如 :

    • 学生表(学号,姓名,性别,班级) :每个学生的学号是唯一的,学号就是一个主键

    • 成绩表(学号,课程号,成绩):成绩表中单一一个属性无法唯一标识一条记录,学号和课程号的组合才可以唯一标识一条记录,所以 **学号和课程号的属性组是一个主键 **,学号是外键,课程号也是外键

    • 主键是能确定一条记录的唯一标识

    • 外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性

    • 表的外键是另一表的主键, 外键可以有重复的, 可以是空值

    • A表中的一个字段,是B表的主键,那他就可以是A表的外键。

    link

    select

    • 如需获取名为 "LastName" 和 "FirstName" 的列的内容(从名为 "Persons" 的数据库表),使用类似这样的 SELECT 语句:
    SELECT LastName,FirstName FROM Persons
    
    • 现在我们希望从 "Persons" 表中选取所有的列。使用符号 * 取代列的名称,就像这样:
    SELECT * FROM Persons
    

    提示:星号(*)是选取所有列的快捷方式。

  • 相关阅读:
    Codeforces 992C(数学)
    Codeforces 990C (思维)
    Codeforces 989C (构造)
    POJ 1511 Invitation Cards(链式前向星,dij,反向建边)
    Codeforces 1335E2 Three Blocks Palindrome (hard version)(暴力)
    POJ 3273 Monthly Expense(二分)
    POJ 2566 Bound Found(尺取前缀和)
    POJ 1321 棋盘问题(dfs)
    HDU 1506 Largest Rectangle in a Histogram(单调栈)
    POJ 2823 Sliding Window(单调队列)
  • 原文地址:https://www.cnblogs.com/monkey-moon/p/9374340.html
Copyright © 2011-2022 走看看