博客
关于我
python mysql 基于 sqlalvhrmy_Python操作MySQL:pymysql和SQLAlchemy
阅读量:800 次
发布时间:2023-03-06

本文共 6185 字,大约阅读时间需要 20 分钟。

pymsql与SQLAlchemy操作MySQL数据库的详细指南

1. pymsql 操作MySQL

pymsql 是 Python 中操作 MySQL 的模块,其使用方法与 MySQLdb 几乎相同。以下是 pymsql 的基本使用方法。

1.1 下载安装

可以通过 pip3 安装 pymsql:

pip3 install pymysql

1.2基本操作

1.2.1 执行 SQL

  • 创建连接:
  • conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
    1. 创建游标:
    2. cursor = conn.cursor()
      1. 执行 SQL 并获取影响行数:
      2. effect_row = cursor.execute("update hosts set host = '1.1.1.2'")
        1. 带参数的 SQL 执行:
        2. effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,))
          1. 执行多行插入:
          2. effect_row = cursor.executemany("insert into hosts(host,color_id)values(%s,%s)", [("1.1.1.11",1),("1.1.1.11",2)])
            1. 提交事务:
            2. conn.commit()
              1. 关闭游标和连接:
              2. cursor.close()conn.close()

                1.3 获取查询数据

              3. 查询所有数据:
              4. cursor.execute("select * from hosts")row_1 = cursor.fetchone()
                1. 获取前 n 行数据:
                2. row_2 = cursor.fetchmany(3)
                  1. 获取所有数据:
                  2. row_3 = cursor.fetchall()
                    1. 分页查询:
                    2. cursor.scroll(1, mode='relative')  # 相对当前位置移动cursor.scroll(2, mode='absolute')  # 相对绝对位置移动

                      1.4 数据类型处理

                      如果需要获取字典格式数据,可以设置字典型游标:

                      cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)row = cursor.execute("call p1()").fetchone()

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

                      自增 ID 可通过 lastrowid 获取:

                      new_id = cursor.lastrowid

                      3. SQL 注入示例

                      注意:SQL 注入有安全风险,请谨慎操作。

                      user = input("username:")pwd = input("password:")conn = pymysql.connect(host="localhost", user='root', password='', database="db3")cursor = conn.cursor()sql = "select * from userinfo where username='%s' and pwd='%s'" % (user, pwd)cursor.execute(sql)result = cursor.fetchone()cursor.close()conn.close()if result:    print('登录成功')else:    print('登录失败')

                      4. SQLAlchemy 操作数据库

                      SQLAlchemy 是一个 ORM 框架,支持通过 ORM 操作数据库。

                      4.1 安装

                      安装 SQLAlchemy:

                      pip3 install SQLAlchemy

                      4.2 基本操作

                    3. 创建连接:
                    4. from sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)
                      1. 执行 SQL:
                      2. cur = engine.execute("INSERT INTO hosts (host, color_id) VALUES ('1.1.1.22', 3)")cur.lastrowid  # 获取新插入行的自增 ID
                        1. 执行多行插入:
                        2. cur = engine.execute("INSERT INTO hosts (host, color_id) VALUES (%s, %s)", [('1.1.1.22', 3), ('1.1.1.221', 3)])
                          1. 带参数的 SQL:
                          2. cur = engine.execute("INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)", {'host': '1.1.1.99', 'color_id': 3})
                            1. 查询数据:
                            2. cur = engine.execute("select * from hosts")row = cur.fetchone()
                              1. 获取所有数据:
                              2. rows = cur.fetchall()

                                4.3 ORM 操作

                              3. 创建 ORM 模型:
                              4. from sqlalchemy.ext.declarative import declarative_basefrom sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Indexfrom sqlalchemy.orm import sessionmaker, relationshipBase = declarative_base()engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5)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 f"{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 f"{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 Server(Base):    __tablename__ = 'server'    id = Column(Integer, primary_key=True, autoincrement=True)    hostname = Column(String(64), unique=True, nullable=False)    def __repr__(self):        return f"{self.id}-{self.hostname}"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)    def __repr__(self):        return f"{self.id}-{self.name}"
                                1. 创建表和数据:
                                2. Session = sessionmaker(bind=engine)session = Session()# 创建单个用户对象user = Users(name="alex0", extra='sb')session.add(user)# 创建多个用户对象session.add_all([    Users(name="alex1", extra='sb'),    Users(name="alex2", extra='sb'),])session.commit()
                                  1. 删除数据:
                                  2. session.query(Users).filter(Users.id > 2).delete()session.commit()
                                    1. 更新数据:
                                    2. 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()
                                      1. 查询数据:
                                      2. # 获取所有用户users = session.query(Users).all()# 获取用户的 name 和 extra 字段users_names = session.query(Users.name, Users.extra).all()# 获取名为 'alex' 的用户alex_users = session.query(Users).filter_by(name='alex').all()# 获取第一名 alex 的用户first_alex = session.query(Users).filter_by(name='alex').first()
                                        1. 高级查询:
                                        2. # 条件查询ret = session.query(Users).filter_by(name='alex').all()# 组合查询ret = session.query(Users).filter(text("id < :value and name=':name")).params(value=224, name='ed').all()# 带表达式查询ret = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all()
                                          1. 排序和分组:
                                          2. ret = session.query(Users).order_by(Users.name.desc()).all()ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()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()
                                            1. 关联查询:
                                            2. ret = session.query(Users, Favor).filter(Users.id == Favor.nid).all()ret = session.query(Person).join(Favor).all()ret = session.query(Person).join(Favor, isouter=True).all()
                                              1. 操作组合:
                                              2. q1 = session.query(Users.name).filter(Users.id > 2)q2 = session.query(Favor.caption).filter(Favor.nid < 2)ret = q1.union(q2).all()ret = q1.union_all(q2).all()

                                                更多 SQLAlchemy 功能请参考官方文档。

    转载地址:http://poafk.baihongyu.com/

    你可能感兴趣的文章
    python nltk nltk_data 离线安装,chatterbot
    查看>>
    Redis 限流的 3 种方式,还有谁不会?
    查看>>
    Python这么慢,为啥大公司还在用?
    查看>>
    python note 06 编码方式
    查看>>
    python numba 转灰度图_使用NumPy、Numba的简单使用(二)
    查看>>
    Python Numpy 关于 linspace()函数 使用详解(全)
    查看>>
    Python numpy插入、读取至postgreSQL数据库中bytea类型字段
    查看>>
    Python numpy数据的保存和读取
    查看>>
    python numpy矩阵索引_python – 在2D numpy ndarray或numpy矩阵中获取前N个值的索引
    查看>>
    Python OCR库:自动化测试验证码识别神器!
    查看>>
    python opencv - 斑点检测或圆形检测
    查看>>
    Python还可以做情感分析你不看看吗?
    查看>>
    Python OpenCV HoughLinesP 无法检测线
    查看>>
    Python OpenCV-使用透明度覆盖图像
    查看>>
    python Opencv图像基础操作
    查看>>
    Python OpenCV将图像转换为字节字符串?
    查看>>
    python OpenCV视频的读取及保存
    查看>>
    python open和file的区别
    查看>>
    python open读取文件并对换行进行处理
    查看>>
    python os, os.path和sys模块
    查看>>