本文共 6185 字,大约阅读时间需要 20 分钟。
pymsql 是 Python 中操作 MySQL 的模块,其使用方法与 MySQLdb 几乎相同。以下是 pymsql 的基本使用方法。
可以通过 pip3 安装 pymsql:
pip3 install pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123', db='t1')
cursor = conn.cursor()
effect_row = cursor.execute("update hosts set host = '1.1.1.2'") effect_row = cursor.execute("update hosts set host = '1.1.1.2' where nid > %s", (1,)) 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()
cursor.execute("select * from hosts")row_1 = cursor.fetchone() row_2 = cursor.fetchmany(3)
row_3 = cursor.fetchall()
cursor.scroll(1, mode='relative') # 相对当前位置移动cursor.scroll(2, mode='absolute') # 相对绝对位置移动
如果需要获取字典格式数据,可以设置字典型游标:
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)row = cursor.execute("call p1()").fetchone() 自增 ID 可通过 lastrowid 获取:
new_id = cursor.lastrowid
注意: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('登录失败') SQLAlchemy 是一个 ORM 框架,支持通过 ORM 操作数据库。
安装 SQLAlchemy:
pip3 install SQLAlchemy
from sqlalchemy import create_engineengine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/t1", max_overflow=5) cur = engine.execute("INSERT INTO hosts (host, color_id) VALUES ('1.1.1.22', 3)")cur.lastrowid # 获取新插入行的自增 ID cur = engine.execute("INSERT INTO hosts (host, color_id) VALUES (%s, %s)", [('1.1.1.22', 3), ('1.1.1.221', 3)]) cur = engine.execute("INSERT INTO hosts (host, color_id) VALUES (%(host)s, %(color_id)s)", {'host': '1.1.1.99', 'color_id': 3}) cur = engine.execute("select * from hosts")row = cur.fetchone() rows = cur.fetchall()
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}" 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()
session.query(Users).filter(Users.id > 2).delete()session.commit()
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() # 获取所有用户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()
# 条件查询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() 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()
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()
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/