美文网首页
Python 学习笔记17 - 访问数据库

Python 学习笔记17 - 访问数据库

作者: WesleyLien | 来源:发表于2017-09-14 21:33 被阅读0次

    使用 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))')
    # 继续执行一条SQL语句,插入一条记录:
    cursor.execute('insert into user (id, name) values (\'1\', \'Michael\')')
    
    # 通过rowcount获得插入的行数:
    cursor.rowcount
    
    # 关闭Cursor:
    cursor.close()
    
    # 提交事务:
    conn.commit()
    
    # 关闭Connection:
    conn.close()
    

    查询记录:

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

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

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

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

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

    使用 MySQL

    MySQL 官方提供了 mysql-connector-python 驱动,但是安装的时候需要给 pip 命令加上参数 --allow-external

    $ pip install mysql-connector-python --allow-external mysql-connector-python
    

    或者

    $ pip install mysql-connector
    

    Note: MySQL 的 SQL 占位符是 %s

    # 导入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

    在 Python 中,最有名的 ORM 框架是 SQLAlchemy

    完成SQLAlchemy的初始化和具体每个表的class定义:

    # 导入:
    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)
    

    插入:

    # 创建session对象,DBSession对象 session 可视为当前数据库连接
    session = DBSession()
    
    # 创建新User对象:
    new_user = User(id='5', name='Bob')
    
    # 添加到session:
    session.add(new_user)
    
    # 提交即保存到数据库:
    session.commit()
    
    # 关闭session:
    session.close()
    

    查询:

    # 创建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()
    

    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

    相关文章

      网友评论

          本文标题:Python 学习笔记17 - 访问数据库

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