SQLAlchemy 连接 MySQL 数据库(一)

一、ORM介绍

ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射。简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对应关系。这样,我们要操作数据库,数据库中的表或者表中的一条记录就可以直接通过操作类或者类实例来完成。ORM 相当于把数据库也给你实例化了,在代码操作MySQL中级又加了orm这一层。

ORM的优点:

  • 隐藏了数据访问细节,使得我们的通用数据库交互变得简单易行,并且完全不用考虑SQL语句
  • ORM使我们构造固化数据结构变得简单易行

二、sqlalchemy安装

SQLAlchemy 是Python 社区最知名的 ORM 工具之一,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型。

在windows下通过pip安装SQLAlchemy(这里我们使用的是python3.5):

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

三、连接与创建

在命令行下输入下面命令启动 MySQL:

$ mysql -uroot -p

然后创建数据库blog:

> create database blog;

1.连接数据库

新建个 Python 文件 db_link_test.py ,

# coding: utf-8
from sqlalchemy import create_engine
# 创建实例,并连接blog库
engine = create_engine('mysql+pymysql://root:0208@localhost:3306/blog?charset=utf8')
print(engine)

然后运行程序,如果输出下面信息,即说明连接成功。

Engine(mysql+pymysql://root:*@localhost:3306/blog?charset=utf8)

2.描述表结构

要使用 ORM, 我们需要将数据表的结构用 ORM 的语言描述出来,我们以一个users表为例,

# coding: utf-8
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, String, Integer

engine = create_engine('mysql+pymysql://root:0208@localhost:3306/blog?charset=utf8')
Base = declarative_base()

class User(Base):
    # __tablename__ 指定在 MySQL 中表的名字
    __tablename__ = 'users'
    # Column 代表数据库中的一列
    id = Column(Integer, primary_key=True)
    username = Column(String(64), nullable=False, index=True)
    password = Column(String(64), nullable=False)
    email = Column(String(64), nullable=False, index=True)

    def __repr__(self):
        return '%s(%r)' % (self.__class__.__name__, self.username)
  • __tablename__ 指定在 MySQL 中表的名字,
  • Column 代表数据库中的一列,
  • nullable=False 代表这一列不可以为空,index=True 表示在该列创建索引。

四、关系定义

1、一对多关系

对于一个普通的博客应用来说,用户和文章显然是一个一对多的关系,一篇文章属于一个用户,一个用户可以写很多篇文章,那么他们之间的关系可以这样定义:

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(64), nullable=False, index=True)
    password = Column(String(64), nullable=False)
    email = Column(String(64), nullable=False, index=True)
    # 一对多:
    articles = relationship('Article')

class Article(Base):
    __tablename__ = 'articles'
    id = Column( Integer, primary_key =True )
    title = Column( String(255) , nullable=False , index = True )
    content = Column(Text)
    # “多”的一方的 articles 表是通过外键关联到 users 表的:
    user_id = Column(Integer,ForeignKey('users.id'))
    author = relationship('User')

说明:(1).每篇文章有一个外键指向 users 表中的主键 id, 而在 User 中使用 SQLAlchemy 提供的 relationship 描述 关系。而用户与文章的之间的这个关系是双向的,所以我们看到上面的两张表中都定义了 relationship。
SQLAlchemy 提供了 backref 让我们可以只需要定义一个关系:

articles = relationship(‘Article’, backref=’author’)

添加了这个就可以不用再在 Article 中定义 relationship 了!所以上面也可以这么写:

class User(Base):
    ...
    articles = relationship('Article' , backref='author')

class Article(Base):
    ...

(2).通过relationship中的backref字段反向查出所有它在User表里的关联项数据.

def Query2(session):
    print(session.query(Article).get(1) )
    print(session.query(Article).get(1).author )

此处session指会话,后面再提,第一句是查询articles表中的第一行,第二句是通过找到articles表中的第一行中的外键user_id字段,再根据这个字段数字找到users表中id所在行。

图示:articles表
这里写图片描述
users表:
这里写图片描述
输出结果如下:

Article(‘Tempore cumque esse sed.’)
User(‘Carmen Valencia’)

2、一对一关系

在 User 中我们只定义了几个必须的字段, 但通常用户还有很多其他信息,但这些信息可能不是必须填写的,我们可以把它们放到另一张 UserInfo 表中,这样 User 和 UserInfo 就形成了一对一的关系。你可能会奇怪一对一关系为什么不在一对多关系前面?那是因为一对一关系是基于一对多定义的,定义方法和一对多相同,只是需要添加 userlist=False 。

class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    username = Column(String(64), nullable=False, index=True)
    password = Column(String(64), nullable=False)
    email    = Column(String(64), nullable=False, index=True)
    articles = relationship('Article' , backref='author')
    userinfo = relationship('UserInfo',backref='user',uselist=False)

class UserInfo(Base):
    __tablename__ = 'userinfos'
    id = Column(Integer, primary_key =True)
    name = Column( String(64))
    qq = Column(String(11))
    phone=Column(String(11))
    link=Column(String(64))
    user_id = Column(Integer,ForeignKey('users.id'))
3、多对多关系

一遍博客通常有一个分类,好几个标签。标签与博客之间就是一个多对多的关系。多对多关系不能直接定义,需要分解成俩个一对多的关系,为此,需要一张额外的表 (即article_tag) 来协助完成:

# 中间表 自己创建。不需要手动管理,orm自动维护
article_tag = Table(
    'article_tag',Base.metadata,
    Column('article_id',Integer,ForeignKey('articles.id')),
    Column('tag_id',Integer,ForeignKey('tags.id'))
)

class Tag(Base):
    __tablename__= 'tags'
    id = Column(Integer,primary_key=True)
    name = Column( String(64) , nullable=False , index = True)

class Article(Base):
    __tablename__ = 'articles'
    id      = Column( Integer, primary_key =True )
    title   = Column( String(255) , nullable=False , index = True )
    content = Column(Text)
    user_id = Column(Integer,ForeignKey('users.id'))
    cate_id = Column(Integer, ForeignKey('categories.id'))
    #  articles 表不知道第三张表,所以关联一下第三张表
    tags = relationship('Tag', secondary='article_tag', backref='articles')

说明:创建了article_tag表,有两个字段 article_id 和 tag_id 。

4、映射到数据

表已经描述好了,在文件末尾使用下面的命令在我们连接的数据库中创建对应的表:

if __name__ == '__main__':
    Base.metadata.create_all(engine) #创建表结构 (这里是父类调子类)

这里写图片描述

### 回答1: 使用SQLAlchemy连接MySQL数据库的步骤如下: 1. 安装SQLAlchemy库 可以使用pip命令进行安装: ``` pip install sqlalchemy ``` 2. 导入SQLAlchemy库 在Python代码中导入SQLAlchemy库: ``` from sqlalchemy import create_engine ``` 3. 创建数据库连接 使用create_engine函数创建数据库连接,需要指定MySQL数据库连接信息,例如: ``` engine = create_engine('mysql+pymysql://username:password@host:port/database') ``` 其中,username是MySQL数据库的用户名,password是密码,host是MySQL服务器的地址,port是MySQL服务器的端口号,database是要连接数据库名称。 4. 创建数据库会话 使用create_session函数创建数据库会话,例如: ``` from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) session = Session() ``` 5. 执行SQL语句 使用session对象执行SQL语句,例如: ``` result = session.execute('SELECT * FROM table_name') ``` 其中,table_name是要查询的表名。 6. 关闭数据库会话 使用session对象关闭数据库会话,例如: ``` session.close() ``` 以上就是使用SQLAlchemy连接MySQL数据库的基本步骤。 ### 回答2: SQLAlchemy是一个Python的ORM(对象关系映射)框架,提供了一种操作多种数据库的方式。在使用SQLAlchemy连接MySQL数据库时,需要先安装MySQL Connector/Python或PyMySQL驱动程序。其中MySQL Connector/Python是官方提供的MySQL驱动程序,而PyMySQL是Python MySQL客户端库之一。 首先,需要在Python中导入SQLAlchemy和相应的驱动程序。如使用MySQL Connector/Python: ``` import mysql.connector from sqlalchemy import create_engine ``` 如使用PyMySQL: ``` import pymysql from sqlalchemy import create_engine ``` 接着,需要创建一个数据库引擎(engine),并指定连接数据库的URL,其中包括主机、端口、数据库名称、用户名和密码等信息。如使用MySQL Connector/Python: ``` # 创建数据库引擎 engine = create_engine("mysql+mysqlconnector://username:password@hostname:port/database") # 连接数据库 conn = engine.connect() # 执行SQL语句 result = conn.execute("SELECT * FROM table") # 关闭连接 conn.close() ``` 其中,username和password是连接MySQL数据库的用户名和密码,hostname是MySQL服务器的主机名或IP地址,port是MySQL服务器的端口号(默认为3306),database是所要连接数据库的名称。 如使用PyMySQL: ``` # 创建数据库引擎 engine = create_engine("mysql+pymysql://username:password@hostname:port/database") # 连接数据库 conn = engine.connect() # 执行SQL语句 result = conn.execute("SELECT * FROM table") # 关闭连接 conn.close() ``` 需要注意的是,MySQL Connector/Python和PyMySQL连接URL格式略有不同。在使用MySQL Connector/Python时,URL中需要指定mysql+mysqlconnector;而在使用PyMySQL时,URL中需要指定mysql+pymysql。在其他方面,两者的使用方法大同小异。 总的来说,使用SQLAlchemy连接MySQL数据库非常方便。只需安装相应的驱动程序,创建数据库引擎,连接数据库,执行SQL语句即可实现与MySQL数据库的交互。同时,SQLAlchemy提供了良好的抽象层,可以帮助开发者更加简单、高效地访问数据库。 ### 回答3: SQLAlchemy是一个Python ORM库,它提供了许多方便的接口和高效的数据访问方法,让Python开发者可以轻松地与各种关系型数据库交互。MySQL是一个流行的开源数据库SQLAlchemy库可以与MySQL数据库进行交互。下面是连接MySQL数据库的步骤: 1. 安装MySQL Connector Python 要连接MySQL数据库,首先需要安装MySQL Connector Python,这是MySQL官方提供的Python数据库驱动程序。可以使用pip命令安装,如下所示: ``` pip install mysql-connector-python ``` 2. 创建Engine对象 在Python中与MySQL数据库交互,需要创建Engine对象。Engine是SQLAlchemy最重要的对象之一,它用于处理所有与数据库的交互。代码示例如下: ```python from sqlalchemy import create_engine engine = create_engine('mysql+mysqlconnector://user:password@localhost:port/dbname') ``` 在创建Engine对象的时候,需要传入MySQL数据库连接信息。连接信息包括数据库的用户名、密码、主机地址和端口号等信息。 3. 创建Session对象 在与MySQL数据库交互时,可以使用Session对象来执行SQL查询语句。Session对象可以通过Engine对象创建。代码示例如下: ```python from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) session = Session() ``` 在创建Session对象之前,需要安装SQLAlchemy的ORM库。可以使用pip命令进行安装: ``` pip install sqlalchemy ``` 4. 执行SQL语句 通过Session对象执行SQL语句,可以使用Session对象提供的许多方法。例如,可以使用Query对象查询表中的所有记录。代码示例如下: ```python from sqlalchemy.orm import Query query = Query(cls).select_from(cls) data = session.execute(query).fetchall() print(data) ``` 以上就是使用SQLAlchemy连接MySQL数据库的步骤。需要注意的是,连接信息需要根据自己的情况进行相应的修改。通过这种方式连接MySQL数据库,可以快速方便地执行各种SQL查询语句,方便开发者进行数据交互。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值