|
| 1 | +# _*_ coding: utf-8 _*_ |
| 2 | + |
| 3 | +""" |
| 4 | +python_sqlalchemy.py by xianhu |
| 5 | +""" |
| 6 | + |
| 7 | +import sqlalchemy |
| 8 | +import sqlalchemy.orm |
| 9 | +import sqlalchemy.ext.declarative |
| 10 | + |
| 11 | +# 利用数据库字符串构造engine, echo为True将打印所有的sql语句 |
| 12 | +engine = sqlalchemy.create_engine("mysql+pymysql://username:password@hostname/dbname", encoding="utf8", echo=True) |
| 13 | + |
| 14 | + |
| 15 | +""" |
| 16 | +# 利用engine创建connection,这里不需要close操作 |
| 17 | +with engine.connect() as conn: |
| 18 | + # 最基础的用法 |
| 19 | + result = conn.execute("select * from tablename limit 10;") |
| 20 | + for item in result: |
| 21 | + print(item) |
| 22 | +
|
| 23 | + # execute的几种用法,这里具体还是得参考pymysql的用法,这里不需要执行commit操作 |
| 24 | + conn.execute("insert into tablename(id, url, title) values(1, "url1", "title1");") |
| 25 | + conn.execute("insert into tablename(id, url, title) values(%s, %s, %s);", 2, "url2", "title2") |
| 26 | + conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", (3, "url3", "title3")) |
| 27 | + conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", [(31, "url31", "title31"), (32, "url32", "title32")]) |
| 28 | +
|
| 29 | + # 使用事务可以进行批量提交和回滚 |
| 30 | + trans = conn.begin() |
| 31 | + try: |
| 32 | + conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", [(4, "url4", "title4"), (5, "url5", "title5")]) |
| 33 | + trans.commit() |
| 34 | + except Exception as excep: |
| 35 | + trans.rollback() |
| 36 | + raise |
| 37 | +""" |
| 38 | + |
| 39 | +# 利用ORM特性生成模型 |
| 40 | +Base = sqlalchemy.ext.declarative.declarative_base() |
| 41 | + |
| 42 | + |
| 43 | +# 构建模型User |
| 44 | +class User(Base): |
| 45 | + __tablename__ = "User" |
| 46 | + id = sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, autoincrement=True) |
| 47 | + name = sqlalchemy.Column("name", sqlalchemy.String(50), default="", unique=True) |
| 48 | + age = sqlalchemy.Column("age", sqlalchemy.Integer, nullable=False) |
| 49 | + |
| 50 | +# 利用Session对象连接数据库 |
| 51 | +DBSessinon = sqlalchemy.orm.sessionmaker(bind=engine) # 创建会话类 |
| 52 | +session = DBSessinon() # 创建会话对象 |
| 53 | + |
| 54 | +# 创建表(如果表已经存在,则不会创建) |
| 55 | +Base.metadata.create_all(engine) |
| 56 | + |
| 57 | +try: |
| 58 | + # 清空数据,不需要commit操作 |
| 59 | + session.query(User).filter(User.id != -1).delete() |
| 60 | + |
| 61 | + # 插入数据,这里的一个user只插入一次,第二次插入不生效 |
| 62 | + user = User(name="tobi", age=20) |
| 63 | + session.add(user) |
| 64 | + session.commit() |
| 65 | + |
| 66 | + # 修改数据 |
| 67 | + user.name = "allen" |
| 68 | + session.merge(user) # 使用merge方法,如果存在则修改,如果不存在则插入 |
| 69 | + session.query(User).filter(User.id == user.id).update({"name": "carol"}) # 使用update方法 |
| 70 | + |
| 71 | + # 查询数据 |
| 72 | + users = session.query(User) # 返回全部结果 |
| 73 | + for user in users: |
| 74 | + print(user.id, user.name, user.age) |
| 75 | + user = session.query(User).get(2) # 返回结果集的第二项 |
| 76 | + users = session.query(User)[1:3] # 返回结果集中的第2-3项 |
| 77 | + |
| 78 | + # 其他高级查询 |
| 79 | + user = session.query(User).filter(User.id < 6).first() # 条件查询 |
| 80 | + users = session.query(User).order_by(User.name) # 排序查询 |
| 81 | + users = session.query(User).order_by(sqlalchemy.desc(User.name)) # 排序查询之倒序 |
| 82 | + users = session.query(User.id, User.name) # 只查询部分属性 |
| 83 | + users = session.query(User.name.label("user_name")).all() # 给结果集的列取别名 |
| 84 | + for user in users: print(user.user_name) # 这里使用别名 |
| 85 | + users = session.query(sqlalchemy.distinct(User.name)).all() # 去重查询 |
| 86 | + user_count = session.query(User.name).count() # 统计全部数量 |
| 87 | + age_avg = session.query(sqlalchemy.func.avg(User.age)).first() # 求平均值 |
| 88 | + age_sum = session.query(sqlalchemy.func.sum(User.age)).first() # 求和运算 |
| 89 | + users = session.query(sqlalchemy.func.count(User.name).label("count"), User.age).group_by(User.age) # 分组查询 |
| 90 | + for user in users: |
| 91 | + print("age:{0}, count:{1}".format(user.age, user.count)) |
| 92 | + |
| 93 | +except Exception as excep: |
| 94 | + session.rollback() |
| 95 | + raise |
0 commit comments