|
8 | 8 | import sqlalchemy.orm |
9 | 9 | import sqlalchemy.ext.declarative |
10 | 10 |
|
11 | | -# 利用数据库字符串构造engine, echo为True将打印所有的sql语句 |
12 | | -engine = sqlalchemy.create_engine("mysql+pymysql://username:password@hostname/dbname", encoding="utf8", echo=True) |
| 11 | +# 利用数据库字符串构造engine, echo为True将打印所有的sql语句, 其他数据库的链接方式可自行百度 |
| 12 | +# engine = sqlalchemy.create_engine("mysql+pymysql://username:password@hostname/dbname", encoding="utf8", echo=True) |
| 13 | +engine = sqlalchemy.create_engine("mysql+pymysql://dba_0:mimadba_0@101.200.174.172/data_secret", encoding="utf8", echo=False) |
13 | 14 |
|
14 | | -# tset |
15 | 15 | """ |
16 | | -# 利用engine创建connection,这里不需要close操作 |
| 16 | +# 利用engine创建connection,因为使用了with所以不需要close操作,这部分不是重点 |
17 | 17 | with engine.connect() as conn: |
18 | 18 | # 最基础的用法 |
19 | 19 | result = conn.execute("select * from tablename limit 10;") |
20 | 20 | for item in result: |
21 | 21 | print(item) |
22 | 22 |
|
23 | | - # execute的几种用法,这里具体还是得参考pymysql的用法,这里不需要执行commit操作 |
24 | | - conn.execute("insert into tablename(id, url, title) values(1, "url1", "title1");") |
| 23 | + # execute的几种用法,这里具体还是得参考pymysql的用法,不需要执行commit操作 |
| 24 | + conn.execute("insert into tablename(id, url, title) values(1, 'url1', 'title1');") |
25 | 25 | conn.execute("insert into tablename(id, url, title) values(%s, %s, %s);", 2, "url2", "title2") |
26 | 26 | conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", (3, "url3", "title3")) |
27 | 27 | conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", [(31, "url31", "title31"), (32, "url32", "title32")]) |
|
34 | 34 | except Exception as excep: |
35 | 35 | trans.rollback() |
36 | 36 | raise |
| 37 | + trans.close() |
37 | 38 | """ |
38 | 39 |
|
39 | | -# 利用ORM特性生成模型 |
40 | | -Base = sqlalchemy.ext.declarative.declarative_base() |
| 40 | +# 首先需要生成一个BaseModel类,作为所有模型类的基类 |
| 41 | +BaseModel = sqlalchemy.ext.declarative.declarative_base() |
41 | 42 |
|
42 | 43 |
|
43 | | -# 构建模型User |
44 | | -class User(Base): |
45 | | - __tablename__ = "User" |
| 44 | +# 构建数据模型User |
| 45 | +class User(BaseModel): |
| 46 | + __tablename__ = "Users" # 表名 |
46 | 47 | __table_args__ = { |
47 | | - 'mysql_engine': 'InnoDB', |
48 | | - 'mysql_charset': 'utf8' |
| 48 | + "mysql_engine": "InnoDB", # 表的引擎 |
| 49 | + "mysql_charset": "utf8", # 表的编码格式 |
49 | 50 | } |
| 51 | + |
| 52 | + # 表结构,具体更多的数据类型自行百度 |
50 | 53 | id = sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, autoincrement=True) |
51 | | - name = sqlalchemy.Column("name", sqlalchemy.String(50), default="", unique=True) |
52 | | - age = sqlalchemy.Column("age", sqlalchemy.Integer, nullable=False) |
| 54 | + name = sqlalchemy.Column("name", sqlalchemy.String(50), nullable=False) |
| 55 | + age = sqlalchemy.Column("age", sqlalchemy.Integer, default=0) |
| 56 | + |
| 57 | + # 添加角色id外键(关联到Role.id属性) |
| 58 | + role_id = sqlalchemy.Column("role_id", sqlalchemy.Integer, sqlalchemy.ForeignKey("Roles.id"), default=-1) |
| 59 | + |
| 60 | + # 添加关系属性(关联到role_id外键上) |
| 61 | + role = sqlalchemy.orm.relationship("Role", foreign_keys="User.role_id", backref="User_role") |
| 62 | + |
| 63 | + |
| 64 | +# 构建数据模型Role |
| 65 | +class Role(BaseModel): |
| 66 | + __tablename__ = "Roles" # 表名 |
| 67 | + __table_args__ = { |
| 68 | + "mysql_engine": "InnoDB", # 表的引擎 |
| 69 | + "mysql_charset": "utf8", # 表的编码格式 |
| 70 | + } |
| 71 | + |
| 72 | + # 表结构,具体更多的数据类型自行百度 |
| 73 | + id = sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True) |
| 74 | + name = sqlalchemy.Column("name", sqlalchemy.String(50), unique=True) |
| 75 | + |
| 76 | + # 添加关系属性(关联到User.role_id属性上) |
| 77 | + users = sqlalchemy.orm.relationship("User", foreign_keys='User.role_id', backref="Role_users") |
| 78 | + |
53 | 79 |
|
54 | 80 | # 利用Session对象连接数据库 |
55 | 81 | DBSessinon = sqlalchemy.orm.sessionmaker(bind=engine) # 创建会话类 |
56 | 82 | session = DBSessinon() # 创建会话对象 |
57 | 83 |
|
58 | | -# 创建表(如果表已经存在,则不会创建) |
59 | | -Base.metadata.create_all(engine) |
| 84 | + |
| 85 | +# 删除所有表 |
| 86 | +BaseModel.metadata.drop_all(engine) |
| 87 | +# 创建所有表,如果表已经存在,则不会创建 |
| 88 | +BaseModel.metadata.create_all(engine) |
60 | 89 |
|
61 | 90 | try: |
62 | 91 | # 清空数据,不需要commit操作 |
63 | 92 | session.query(User).filter(User.id != -1).delete() |
| 93 | + session.query(Role).filter(Role.id != -1).delete() |
| 94 | + # 删除数据的另外一种形式:session.delete() |
64 | 95 |
|
65 | | - # 插入数据,这里的一个user只插入一次,第二次插入不生效 |
66 | | - user = User(name="tobi", age=20) |
| 96 | + # 插入数据,这里的一个实例只插入一次,第二次插入不生效 |
| 97 | + session.add(Role(id=1, name="student")) |
| 98 | + session.add(Role(id=2, name="teacher")) |
| 99 | + session.commit() |
| 100 | + |
| 101 | + session.add(User(name="James", age=20, role_id=1)) |
| 102 | + session.add(User(name="Wade", age=40, role_id=2)) |
| 103 | + session.commit() |
| 104 | + |
| 105 | + user = User(name="Kobe", age=24, role_id=1) |
67 | 106 | session.add(user) |
68 | 107 | session.commit() |
69 | 108 |
|
70 | 109 | # 修改数据 |
71 | | - user.name = "allen" |
| 110 | + user.name = "Allen" |
72 | 111 | session.merge(user) # 使用merge方法,如果存在则修改,如果不存在则插入 |
73 | | - session.query(User).filter(User.id == user.id).update({"name": "carol"}) # 使用update方法 |
| 112 | + session.query(User).filter(User.id == user.id).update({User.name: "Allen"}) # 使用update方法 |
| 113 | + session.query(User).filter(User.id == user.id).update({User.age: User.age + 1}) # 使用update方法,自增操作 |
74 | 114 |
|
75 | 115 | # 查询数据 |
| 116 | + roles = session.query(Role) # 返回全部结果 |
| 117 | + for role in roles: |
| 118 | + print("Role:", role.id, role.name) |
| 119 | + |
76 | 120 | users = session.query(User) # 返回全部结果 |
77 | 121 | for user in users: |
78 | | - print(user.id, user.name, user.age) |
79 | | - user = session.query(User).get(2) # 返回结果集的第二项 |
80 | | - users = session.query(User)[1:3] # 返回结果集中的第2-3项 |
81 | | - |
82 | | - # 其他高级查询 |
83 | | - user = session.query(User).filter(User.id < 6).first() # 条件查询 |
84 | | - users = session.query(User).order_by(User.name) # 排序查询 |
85 | | - users = session.query(User).order_by(sqlalchemy.desc(User.name)) # 排序查询之倒序 |
| 122 | + print("User:", user.id, user.name, user.age, user.role_id) |
| 123 | + |
| 124 | + # 其他获取数据的方式 |
| 125 | + print("get(id):", session.query(User).get(1)) # 返回结果集中id为1的项 |
| 126 | + print("get[1:3]:", session.query(User)[1:3]) # 返回结果集中的第2-3项 |
| 127 | + |
| 128 | + # 其他高级查询,这里以Users表为例 |
| 129 | + users = session.query(User).filter(User.id > 6) # 条件查询 |
| 130 | + users = session.query(User).filter(User.id > 6).all() # 条件查询,返回查询的全部数据 |
| 131 | + user = session.query(User).filter(User.id > 6).first() # 条件查询,返回查询数据的第一项 |
| 132 | + users = session.query(User).filter(User.id > 6).limit(10) # 条件查询,返回最多10条数据 |
| 133 | + users = session.query(User).filter(User.id > 6).offset(2) # 条件查询,从第3条数据开始返回 |
| 134 | + |
| 135 | + users = session.query(User).filter(User.id > 6, User.name == "Kobe") # 条件查询,and操作 |
| 136 | + users = session.query(User).filter(User.id > 6).filter(User.name == "Kobe") # 条件查询,and操作 |
| 137 | + users = session.query(User).filter(sqlalchemy.or_(User.id > 6, User.name == "Kobe")) # 条件查询,or操作 |
| 138 | + users = session.query(User).filter(User.id.in_((1, 2))) # 条件查询,in操作 |
| 139 | + users = session.query(User).filter(sqlalchemy.not_(User.name)) # 条件查询,not操作 |
| 140 | + |
| 141 | + user_count = session.query(User.id).count() # 统计全部user的数量 |
| 142 | + user_count = session.query(sqlalchemy.func.count(User.id)).scalar() # scalar操作返回第一行数据的第一个字段 |
| 143 | + session.query(sqlalchemy.func.count("*")).select_from(User).scalar() # scalar操作返回第一行数据的第一个字段 |
| 144 | + session.query(sqlalchemy.func.count(1)).select_from(User).scalar() # scalar操作返回第一行数据的第一个字段 |
| 145 | + session.query(sqlalchemy.func.count(User.id)).filter(User.id > 0).scalar() # filter() 中包含 User,因此不需要指定表 |
| 146 | + |
| 147 | + session.query(sqlalchemy.func.sum(User.age)).scalar() # 求和运算,运用scalar函数 |
| 148 | + session.query(sqlalchemy.func.avg(User.age)).scalar() # 求均值运算,运用scalar函数 |
| 149 | + session.query(sqlalchemy.func.md5(User.name)).filter(User.id == 1).scalar() # 运用md5函数 |
| 150 | + |
| 151 | + users = session.query(sqlalchemy.distinct(User.name)) # 去重查询,根据name进行去重 |
| 152 | + users = session.query(User).order_by(User.name) # 排序查询,正序查询 |
| 153 | + users = session.query(User).order_by(User.name.desc()) # 排序查询,倒序查询 |
| 154 | + users = session.query(User).order_by(sqlalchemy.desc(User.name)) # 排序查询,倒序查询的另外一种形式 |
| 155 | + |
86 | 156 | users = session.query(User.id, User.name) # 只查询部分属性 |
87 | | - users = session.query(User.name.label("user_name")).all() # 给结果集的列取别名 |
88 | | - for user in users: print(user.user_name) # 这里使用别名 |
89 | | - users = session.query(sqlalchemy.distinct(User.name)).all() # 去重查询 |
90 | | - user_count = session.query(User.name).count() # 统计全部数量 |
91 | | - age_avg = session.query(sqlalchemy.func.avg(User.age)).first() # 求平均值 |
92 | | - age_sum = session.query(sqlalchemy.func.sum(User.age)).first() # 求和运算 |
| 157 | + users = session.query(User.name.label("user_name")) # 结果集的列取别名 |
| 158 | + for user in users: |
| 159 | + print("label test:", user.user_name) # 这里使用别名 |
| 160 | + |
93 | 161 | users = session.query(sqlalchemy.func.count(User.name).label("count"), User.age).group_by(User.age) # 分组查询 |
94 | 162 | for user in users: |
95 | 163 | print("age:{0}, count:{1}".format(user.age, user.count)) |
96 | 164 |
|
| 165 | + # 多表查询 |
| 166 | + result = session.query(User, Role).filter(User.role_id == Role.id) |
| 167 | + for user, role in result: |
| 168 | + print("user %s's role is %s" % (user.name, role.name)) |
| 169 | + users = session.query(User).join(Role, User.role_id == Role.id) |
| 170 | + for user in users: |
| 171 | + print("user join, name:", user.name) |
| 172 | + |
| 173 | + # 关联属性的用法 |
| 174 | + roles = session.query(Role) |
| 175 | + for role in roles: |
| 176 | + print("role:%s users:" % role.name) |
| 177 | + for user in role.users: |
| 178 | + print("\t%s" % user.name) |
| 179 | + users = session.query(User) |
| 180 | + for user in users: |
| 181 | + print("user %s's role is %s" % (user.name, user.role.name)) |
| 182 | + |
97 | 183 | except Exception as excep: |
98 | 184 | session.rollback() |
99 | 185 | raise |
0 commit comments