【转】MySQL— pymysql and SQLAlchemy

【转】MySQL— pymysql and SQLAlchemy

目录

一、pymysql

二、SQLAlchemy

一、pymysql

pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。

1. 下载安装

#在终端直接运行
pip3 install pymysql

2. 使用操作

a. 执行SQL

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
# 创建连接
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
# 创建游标
cursor = conn.cursor()
  
# 执行SQL,并返回受影响行数
effect_row = cursor.execute("update hosts set host = ‘1.1.1.2‘")
  
# 执行SQL,并返回受影响行数
#effect_row = cursor.execute("update hosts set host = ‘1.1.1.2‘ where nid > %s", (1,))
  
# 执行SQL,并返回受影响行数
#effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
  
  
# 提交,不然无法保存新建或者修改的数据
conn.commit()
  
# 关闭游标
cursor.close()
# 关闭连接
conn.close()

b. 获取新创建数据自增ID

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
cursor = conn.cursor()
cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
conn.commit()

# 获取最新自增ID
new_id = cursor.lastrowid

cursor.close()
conn.close()

c. 获取查询数据

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
cursor = conn.cursor()
cursor.execute("select * from hosts")
  
# 获取第一行数据
row_1 = cursor.fetchone()
  
# 获取前n行数据
# row_2 = cursor.fetchmany(3)
# 获取所有数据
# row_3 = cursor.fetchall()
  
conn.commit()
cursor.close()
conn.close()

注:在fetch数据时按照顺序进行,可以使用cursor.scroll(num,mode)来移动游标位置,如:

  • cursor.scroll(1,mode=‘relative‘)     # 相对当前位置移动
  • cursor.scroll(2,mode=‘absolute‘)   # 相对绝对位置移动

d. fetch数据类型

关于默认获取的数据是元组类型,如果想要获得字典类型的数据,即:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pymysql
  
conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
  
# 游标设置为字典类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r = cursor.execute("call p1()")
  
result = cursor.fetchone()
  
conn.commit()
cursor.close()
conn.close()

二、SQLAlchemy

SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。

1. 下载安装

#在终端直接运行
pip3 install SQLAlchemy

2. SQLAlchemy依赖关系

SQLAlchemy本身无法操作数据库,其必须依赖pymsql等第三方插件,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

3. ORM功能使用

使用 ORM/Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 所有组件对数据进行操作。根据类创建对象,对象转换成SQL,执行SQL。

a. 创建表

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

#表明依赖关系并创建连接,最大连接数为5 
engine = create_engine("mysql+pymysql://root:[email protected]:3306/t1", max_overflow=5)
 
Base = declarative_base()
 
# 创建单表
class Users(Base):
    __tablename__ = ‘users‘    # 表名
    id = Column(Integer, primary_key=True,autoincrement=True)    # id列,主键自增
    name = Column(String(32))    # name列
    extra = Column(String(16))    # extra列
 
    __table_args__ = (
    UniqueConstraint(‘id‘, ‘name‘, name=‘uix_id_name‘),    # 创建联合唯一索引
        Index(‘ix_id_name‘, ‘name‘, ‘extra‘),    # 创建普通索引
    )
 
 
# 一对多
class Favor(Base):
    __tablename__ = ‘favor‘
    nid = Column(Integer, primary_key=True)
    caption = Column(String(50), default=‘red‘, unique=True)
 
 
class Person(Base):
    __tablename__ = ‘person‘
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    favor_id = Column(Integer, ForeignKey("favor.nid"))    # 创建外键
 
 
# 多对多
class Group(Base):
    __tablename__ = ‘group‘
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    port = Column(Integer, default=22)
 
 
class Server(Base):
    __tablename__ = ‘server‘
    id = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(64), unique=True, nullable=False)
 
 
class ServerToGroup(Base):
    __tablename__ = ‘servertogroup‘
    nid = Column(Integer, primary_key=True, autoincrement=True)
    server_id = Column(Integer, ForeignKey(‘server.id‘))    # 创建外键
    group_id = Column(Integer, ForeignKey(‘group.id‘))    # 创建外键
 
 
def init_db():
    Base.metadata.create_all(engine)
 
 
def drop_db():
    Base.metadata.drop_all(engine)

注:设置外键的另一种方式 ForeignKeyConstraint([‘other_id‘], [‘othertable.other_id‘])

b. 操作表

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy import create_engine

engine = create_engine("mysql+pymysql://root:[email protected]:3306/t1", max_overflow=5)

Base = declarative_base()

# 创建单表
class Users(Base):
    __tablename__ = ‘users‘
    id = Column(Integer, primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
    UniqueConstraint(‘id‘, ‘name‘, name=‘uix_id_name‘),
        Index(‘ix_id_name‘, ‘name‘, ‘extra‘),
    )

    def __repr__(self):
        return "%s-%s" %(self.id, self.name)

# 一对多
class Favor(Base):
    __tablename__ = ‘favor‘
    nid = Column(Integer, primary_key=True)
    caption = Column(String(50), default=‘red‘, unique=True)

    def __repr__(self):
        return "%s-%s" %(self.nid, self.caption)

class Person(Base):
    __tablename__ = ‘person‘
    nid = Column(Integer, primary_key=True)
    name = Column(String(32), index=True, nullable=True)
    favor_id = Column(Integer, ForeignKey("favor.nid"))
    # 与生成表结构无关,仅用于查询方便
    favor = relationship("Favor", backref=‘pers‘)

# 多对多
class ServerToGroup(Base):
    __tablename__ = ‘servertogroup‘
    nid = Column(Integer, primary_key=True, autoincrement=True)
    server_id = Column(Integer, ForeignKey(‘server.id‘))
    group_id = Column(Integer, ForeignKey(‘group.id‘))
    group = relationship("Group", backref=‘s2g‘)
    server = relationship("Server", backref=‘s2g‘)

class Group(Base):
    __tablename__ = ‘group‘
    id = Column(Integer, primary_key=True)
    name = Column(String(64), unique=True, nullable=False)
    port = Column(Integer, default=22)
    # group = relationship(‘Group‘,secondary=ServerToGroup,backref=‘host_list‘)

class Server(Base):
    __tablename__ = ‘server‘

    id = Column(Integer, primary_key=True, autoincrement=True)
    hostname = Column(String(64), unique=True, nullable=False)

def init_db():
    Base.metadata.create_all(engine)

def drop_db():
    Base.metadata.drop_all(engine)

Session = sessionmaker(bind=engine)
session = Session()

表结构 + 数据库连接

b.1 增

#单条增加
obj = Users(name="alex0", extra=‘sb‘)
session.add(obj)

#多条增加
session.add_all([
    Users(name="alex1", extra=‘sb‘),
    Users(name="alex2", extra=‘sb‘),
])

#提交
session.commit()

b.2 删

#先查询到要删除的记录,再delete
session.query(Users).filter(Users.id > 2).delete()
session.commit()

b.3 改

#先查询,再更新
session.query(Users).filter(Users.id > 2).update({"name" : "099"})    # 直接更改
session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)    # 字符串拼接
session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")    # 数字相加
session.commit()

b.4 查

ret = session.query(Users).all()
ret = session.query(Users.name, Users.extra).all()
ret = session.query(Users).filter_by(name=‘alex‘).all()
ret = session.query(Users).filter_by(name=‘alex‘).first()

ret = session.query(Users).filter(text("id<:value and name=:name")).params(value=224, name=‘fred‘).order_by(User.id).all()

ret = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name=‘ed‘).all()

b.5 其它

# 条件
ret = session.query(Users).filter_by(name=‘alex‘).all()    # 条件内为关键字表达式
ret = session.query(Users).filter(Users.id > 1, Users.name == ‘eric‘).all()    # 条件内为SQL表达式
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == ‘eric‘).all()    # between
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()    # in
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()    # not in
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name=‘eric‘))).all()    # 子查询条件

from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == ‘eric‘)).all()    # and
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == ‘eric‘)).all()    # or
ret = session.query(Users).filter(
    or_(
        Users.id < 2,
        and_(Users.name == ‘eric‘, Users.id > 3),
        Users.extra != ""
    )).all()

# 通配符
ret = session.query(Users).filter(Users.name.like(‘e%‘)).all()    # e开头
ret = session.query(Users).filter(~Users.name.like(‘e%‘)).all()    # 非e开头

# 限制
ret = session.query(Users)[1:2]    # 相当于limit

# 排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()

# 分组
from sqlalchemy.sql import func

ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id)).group_by(Users.name).all()

ret = session.query(
    func.max(Users.id),
    func.sum(Users.id),
    func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()

# 连表

ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()    # 笛卡儿积连表
ret = session.query(Person).join(Favor).all()    # 默认内连 inner join
ret = session.query(Person).join(Favor, isouter=True).all()    # 左连

# 组合
q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union(q2).all()

q1 = session.query(Users.name).filter(Users.id > 2)
q2 = session.query(Favor.caption).filter(Favor.nid < 2)
ret = q1.union_all(q2).all()

参考资料:

1. Python开发【第十九篇】:Python操作MySQL

原文地址:https://www.cnblogs.com/langqi250/p/10070422.html

时间: 2024-10-08 18:00:47

【转】MySQL— pymysql and SQLAlchemy的相关文章

14.python与数据库之mysql:pymysql、sqlalchemy

相关内容: 使用pymysql直接操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 使用sqlmary操作mysql 创建表 查看表 修改表 删除表 插入数据 查看数据 修改数据 删除数据 首发时间:2018-02-24 23:59 [第一次写那么长的博文,若有错误,请不吝与我说明] 直接操作mysql: 前提: 首先需要安装python与mysql交互的库[PyMySQL 是在 Python3 版本中用于连接 MySQL 服务器的一个库]: 安装模块:py

mysql数据库----python操作mysql ------pymysql和SQLAchemy

本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy 一.pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 pip3 install pymysql 使用操作 1.执行SQL 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import pymysql 4 5 # 创建连接 6 conn = pymysql.connect(

python教程18、python操作Mysql,pymysql,SQLAchemy

一.MySQL 1.概述 什么是数据库 ? 答:数据的仓库,和Excel表中的行和列是差不多的,只是有各种约束和不同数据类型的表格 什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一个软件,都有两个主要的功能: a. 将数据保存到文件或内存 b. 接收特定的命令,然后对文件进行相应的操作 PS:如果有了以上软件,无须自己再去创建文件和文件夹,而是直接传递 命令 给上述软件,让其来进行文件操作,他们统称为数据库管理系统(DBMS,Data

特殊汉字“&#146989;”引发的对于字符集的思考;mysql字符集;sqlalchemy字符集设置;客户端字符集设置;

字符集.字符序的概念与联系 在数据的存储上,MySQL提供了不同的字符集支持.而在数据的对比操作上,则提供了不同的字符序支持. MySQL提供了不同级别的设置,包括server级.database级.table级.column级,可以提供非常精准的设置. 什么是字符集.字符序?简单的来说: 字符集(character set):定义了字符以及字符的编码. 字符序(collation):定义了字符的比较规则. 举个例子: 有四个字符:A.B.a.b,这四个字符的编码分别是A = 0, B = 1,

python使用mysql的三个模块:mysql.connector、sqlalchemy、MySQLdb

在python中使用mysql其实很简单,只要先安装对应的模块即可,那么对应的模块都有什么?官方也没指定也没提供,pcat就推荐自己遇到的3个模块:mysql.connector.sqlalchemy.MySQLdb ------------------ 1. 安装mysql.connector MySQL Connector/Python is implementing the MySQL Client/Server protocol completely in Python. No MySQ

python学习之pymysql和sqlalchemy

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用MySQLdb.数据库查询操作 01_python数据库编程基本操作.py import pymysql #1). 创建数据库连接, autocommit是否自动提交修改到数据库中. conn = pymysql.connect(host='localhost', user='root', password='westos', db='Blog', port=3306, autocommi

python3使用Django框架连接mysql(python3+Django+MySQL+pymysql)

改掉系统默认的sqlite3数据库, # Database# https://docs.djangoproject.com/en/1.10/ref/settings/#databases DATABASES = { 'default': {# 'ENGINE': 'django.db.backends.sqlite3', 'ENGINE': 'django.db.backends.mysql',# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'NA

python3.4怎么连接mysql pymysql连接mysql数据库

本文介绍了python3 4连接mysql数据库的方法,在python3 4中使用原来python2 7的mysqldb已不能连接mysql数据库了,可以使用pymysql. 在python3.4中使用原来python2.7的mysqldb已不能连接mysql数据库了,可以使用pymysql,来完成连接mysql的重任. 具体步骤: 序号 描述1 去github上下载pymysql的安装包pymysql https://github.com/PyMySQL/PyMySQL2 解压到某个盘符下3 

【转】python3+Django+MySQL+pymysql

使用python3和Django搭建自己的服务器的时候使用的是sqlite数据库,一切顺利. 可是等到布置生产环境的时候要换成MySQL,根据Django官网的文档也设置好了setting.DATABASES. 但是运行python3 manage.py makemigrations的时候又遇到错误了,查看日志大概的问题就是: ImportError: No module named 'MySQLdb',可是之前明明已经pip3 install pymysql了,大概是因为Django默认的还是