Skip to content

Commit 3a7cb4c

Browse files
committed
update python_sqlalchemy
2 parents cde1bd2 + 474e2ba commit 3a7cb4c

File tree

3 files changed

+123
-37
lines changed

3 files changed

+123
-37
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
### python_lda.py: 玩点高级的--带你入门Topic模型LDA(小改进+附源码)
1414

15-
### python_sqlalchemy: SQLAlchemy入门代码文档
15+
### python_sqlalchemy: 作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼!
1616
============================================================
1717

1818
### 您可以fork该项目,并在修改后提交Pull request

python_base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@
191191
# 普通调用
192192
"{0}, {1} and {2}".format('spam', 'ham', 'eggs') # 基于位置的调用
193193
"{motto} and {pork}".format(motto = 'spam', pork = 'ham') # 基于Key的调用
194-
"{motto} and {0}".format(ham, motto = 'spam') # 混合调用
194+
"{motto} and {0}".format('ham', motto = 'spam') # 混合调用
195195
# 添加键 属性 偏移量 (import sys)
196196
"my {1[spam]} runs {0.platform}".format(sys, {'spam':'laptop'}) # 基于位置的键和属性
197197
"{config[spam]} {sys.platform}".format(sys = sys, config = {'spam':'laptop'}) # 基于Key的键和属性

python_sqlalchemy.py

Lines changed: 121 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,20 @@
88
import sqlalchemy.orm
99
import sqlalchemy.ext.declarative
1010

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)
1314

14-
# tset
1515
"""
16-
# 利用engine创建connection,这里不需要close操作
16+
# 利用engine创建connection,因为使用了with所以不需要close操作,这部分不是重点
1717
with engine.connect() as conn:
1818
# 最基础的用法
1919
result = conn.execute("select * from tablename limit 10;")
2020
for item in result:
2121
print(item)
2222
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');")
2525
conn.execute("insert into tablename(id, url, title) values(%s, %s, %s);", 2, "url2", "title2")
2626
conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", (3, "url3", "title3"))
2727
conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", [(31, "url31", "title31"), (32, "url32", "title32")])
@@ -34,66 +34,152 @@
3434
except Exception as excep:
3535
trans.rollback()
3636
raise
37+
trans.close()
3738
"""
3839

39-
# 利用ORM特性生成模型
40-
Base = sqlalchemy.ext.declarative.declarative_base()
40+
# 首先需要生成一个BaseModel类,作为所有模型类的基类
41+
BaseModel = sqlalchemy.ext.declarative.declarative_base()
4142

4243

43-
# 构建模型User
44-
class User(Base):
45-
__tablename__ = "User"
44+
# 构建数据模型User
45+
class User(BaseModel):
46+
__tablename__ = "Users" # 表名
4647
__table_args__ = {
47-
'mysql_engine': 'InnoDB',
48-
'mysql_charset': 'utf8'
48+
"mysql_engine": "InnoDB", # 表的引擎
49+
"mysql_charset": "utf8", # 表的编码格式
4950
}
51+
52+
# 表结构,具体更多的数据类型自行百度
5053
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+
5379

5480
# 利用Session对象连接数据库
5581
DBSessinon = sqlalchemy.orm.sessionmaker(bind=engine) # 创建会话类
5682
session = DBSessinon() # 创建会话对象
5783

58-
# 创建表(如果表已经存在,则不会创建)
59-
Base.metadata.create_all(engine)
84+
85+
# 删除所有表
86+
BaseModel.metadata.drop_all(engine)
87+
# 创建所有表,如果表已经存在,则不会创建
88+
BaseModel.metadata.create_all(engine)
6089

6190
try:
6291
# 清空数据,不需要commit操作
6392
session.query(User).filter(User.id != -1).delete()
93+
session.query(Role).filter(Role.id != -1).delete()
94+
# 删除数据的另外一种形式:session.delete()
6495

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)
67106
session.add(user)
68107
session.commit()
69108

70109
# 修改数据
71-
user.name = "allen"
110+
user.name = "Allen"
72111
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方法,自增操作
74114

75115
# 查询数据
116+
roles = session.query(Role) # 返回全部结果
117+
for role in roles:
118+
print("Role:", role.id, role.name)
119+
76120
users = session.query(User) # 返回全部结果
77121
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+
86156
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+
93161
users = session.query(sqlalchemy.func.count(User.name).label("count"), User.age).group_by(User.age) # 分组查询
94162
for user in users:
95163
print("age:{0}, count:{1}".format(user.age, user.count))
96164

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+
97183
except Exception as excep:
98184
session.rollback()
99185
raise

0 commit comments

Comments
 (0)