美文网首页
Python 访问数据库(SQLite、MySQL、SQLAlc

Python 访问数据库(SQLite、MySQL、SQLAlc

作者: _YZG_ | 来源:发表于2018-01-09 19:40 被阅读1010次

    一、SQLite

    SQLite是一种嵌入式数据库,它的数据库就是一个文件。由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,在iOS和Android的App中都可以集成。

    Python就内置了SQLite3,所以,在Python中使用SQLite,不需要安装任何东西,直接使用。

    表是数据库中存放关系数据的集合,一个数据库里面通常都包含多个表,比如学生的表,班级的表,学校的表,等等。表和表之间通过外键关联。

    # 导入SQLite驱动:
    >>> import sqlite3
    # 连接到SQLite数据库
    # 数据库文件是test.db
    # 如果文件不存在,会自动在当前目录创建:
    >>> conn = sqlite3.connect('test.db')
    # 创建一个Cursor:
    >>> cursor = conn.cursor()
    # 执行一条SQL语句,创建user表:
    >>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
    <sqlite3.Cursor object at 0x10f8aa260>
    # 继续执行一条SQL语句,插入一条记录:
    >>> cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
    <sqlite3.Cursor object at 0x10f8aa260>
    # 通过rowcount获得插入的行数:
    >>> cursor.rowcount
    1
    # 关闭Cursor:
    >>> cursor.close()
    # 提交事务:
    >>> conn.commit()
    # 关闭Connection:
    >>> conn.close()
    

    查询记录

    >>> conn = sqlite3.connect('test.db')
    >>> cursor = conn.cursor()
    # 执行查询语句:
    >>> cursor.execute('select * from user where id=?', ('1',))
    <sqlite3.Cursor object at 0x10f8aa340>
    # 获得查询结果集:
    >>> values = cursor.fetchall()
    >>> values
    [('1', 'Michael')]
    >>> cursor.close()
    >>> conn.close()
    

    只要搞清楚Connection和Cursor对象,打开后一定记得关闭,就可以放心地使用

    使用Cursor对象执行insert,update,delete语句时,执行结果由rowcount返回影响的行数,就可以拿到执行结果

    使用Cursor对象执行select语句时,通过featchall()可以拿到结果集。结果集是一个list,每个元素都是一个tuple,对应一行记录。

    如果SQL语句带有参数,那么需要把参数按照位置传递给execute()方法,有几个?占位符就必须对应几个参数,例如

    cursor.execute('select * from user where name=? and pwd=?', ('abc', 'password'))
    

    二、MySQL

    由于Python的DB-API定义都是通用的,所以,操作MySQL的数据库代码和SQLite类似。

    macOS安装、配置、删除 MySQL
    安装MySQL驱动

    $ pip install mysql-connector-python 
    如果失败换另一个驱动
    $ pip install mysql-connector
    
    

    首先创建一下数据库

    mysql -u root -p
    输入密码
    
    CREATE DATABASE test;
    
    

    完事之后回到Python

    # 导入MySQL驱动:
    >>> import mysql.connector
    # 注意把password设为你的root口令:
    >>> conn = mysql.connector.connect(user='root', password='password', database='test')
    >>> cursor = conn.cursor()
    # 创建user表:
    >>> cursor.execute('create table user (id varchar(20) primary key, name varchar(20))')
    # 插入一行记录,注意MySQL的占位符是%s:
    >>> cursor.execute('insert into user (id, name) values (%s, %s)', ['1', 'Michael'])
    >>> cursor.rowcount
    1
    # 提交事务:
    >>> conn.commit()
    >>> cursor.close()
    # 运行查询:
    >>> cursor = conn.cursor()
    >>> cursor.execute('select * from user where id = %s', ('1',))
    >>> values = cursor.fetchall()
    >>> values
    [('1', 'Michael')]
    # 关闭Cursor和Connection:
    >>> cursor.close()
    True
    >>> conn.close()
    

    三、SQLAlchemy

    ORM技术:Object-Relational Mapping
    ORM就是把数据库表的行与相应的对象建立关联,互相转换

    $ pip install sqlalchemy
    
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    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))
    
    # 初始化数据库连接: password 为自己数据库密码
    # '数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
    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 = ...
    
    # 由于有了ORM,我们向数据库表中添加一行记录,可以视为添加一个User对象
    # DBSession对象可视为当前数据库连接
    # 创建session对象:
    session = DBSession()
    # 创建新User对象:
    new_user = User(id='5', name='Bob')
    # 添加到session:
    session.add(new_user)
    # 提交即保存到数据库:
    session.commit()
    # 关闭session:
    session.close()
    
    
    
    # 有了ORM,查询出来的可以不再是tuple,而是User对象
    # 创建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
    

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

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

    相关文章

      网友评论

          本文标题:Python 访问数据库(SQLite、MySQL、SQLAlc

          本文链接:https://www.haomeiwen.com/subject/lbjwnxtx.html