SQLAlchemy是Python中最流行的ORM (对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式。本文将介绍如何使用SQLAlchemy ORM进行数据库操作。
目录
安装SQLAlchemy
核心概念
连接数据库
定义数据模型
创建数据库表
基本CRUD操作
查询数据
关系操作
事务管理
最佳实践
安装
bash
pip install sqlalchemy
如果需要连接特定数据库,还需安装相应的驱动程序 :
bash
# PostgreSQL
pip install psycopg2-binary
# MySQL
pip install mysql-connector-python
# SQLite (Python标准库已包含,无需额外安装)
核心概念
Engine:数据库连接的引擎,负责与数据库通信
Session:数据库会话,管理所有持久化操作
Model:数据模型类,对应数据库中的表
Query:查询对象,用于构建和执行数据库查询
连接数据库
python
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 创建数据库连接引擎
# SQLite示例
engine = create_engine('sqlite:///example.db', echo=True)
# PostgreSQL示例
# engine = create_engine('postgresql://username:password@localhost:5432/mydatabase')
# MySQL示例
# engine = create_engine('mysql+mysqlconnector://username:password@localhost:3306/mydatabase')
# 创建会话工厂
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# 创建会话实例
session = SessionLocal()
定义数据模型
python
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, declarative_base
# 创建基类
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True, index=True)
name = Column(String(50), nullable=False)
email = Column(String(100), unique=True, index=True)
# 定义一对多关系
posts = relationship("Post", back_populates="author")
class Post(Base):
__tablename__ = 'posts'
id = Column(Integer, primary_key=True, index=True)
title = Column(String(100), nullable=False)
content = Column(String(500))
author_id = Column(Integer, ForeignKey('users.id'))
# 定义多对一关系
author = relationship("User", back_populates="posts")
# 定义多对多关系(通过关联表)
tags = relationship("Tag", secondary="post_tags", back_populates="posts")
class Tag(Base):
__tablename__ = 'tags'
id = Column(Integer, primary_key=True, index=True)
name = Column(String(30), unique=True, nullable=False)
posts = relationship("Post", secondary="post_tags", back_populates="tags")
# 关联表(用于多对多关系)
class PostTag(Base):
__tablename__ = 'post_tags'
post_id = Column(Integer, ForeignKey('posts.id'), primary_key=True)
tag_id = Column(Integer, ForeignKey('tags.id'), primary_key=True)
创建数据库表
python
# 创建所有表
Base.metadata.create_all(bind=engine)
# 删除所有表
# Base.metadata.drop_all(bind=engine)
基本CRUD操作
创建数据
python
# 创建新用户
new_user = User(name="张三", email="zhangsan@example.com")
session.add(new_user)
session.commit()
# 批量创建
session.add_all([
User(name="李四", email="lisi@example.com"),
User(name="王五", email="wangwu@example.com")
])
session.commit()
读取数据
python
# 获取所有用户
users = session.query(User).all()
# 获取第一个用户
first_user = session.query(User).first()
# 根据ID获取用户
user = session.query(User).get(1)
更新数据
python
# 查询并更新
user = session.query(User).get(1)
user.name = "张三四"
session.commit()
# 批量更新
session.query(User).filter(User.name.like("张%")).update({"name": "张氏"}, synchronize_session=False)
session.commit()
删除数据
python
# 查询并删除
user = session.query(User).get(1)
session.delete(user)
session.commit()
# 批量删除
session.query(User).filter(User.name == "李四").delete(synchronize_session=False)
session.commit()
查询数据
基本查询
python
# 获取所有记录
users = session.query(User).all()
# 获取特定字段
names = session.query(User.name).all()
# 排序
users = session.query(User).order_by(User.name.desc()).all()
# 限制结果数量
users = session.query(User).limit(10).all()
# 偏移量
users = session.query(User).offset(5).limit(10).all()
过滤查询
python
from sqlalchemy import or_
# 等值过滤
user = session.query(User).filter(User.name == "张三").first()
# 模糊查询
users = session.query(User).filter(User.name.like("张%")).all()
# IN查询
users = session.query(User).filter(User.name.in_(["张三", "李四"])).all()
# 多条件查询
users = session.query(User).filter(
User.name == "张三",
User.email.like("%@example.com")
).all()
# 或条件
users = session.query(User).filter(
or_(User.name == "张三", User.name == "李四")
).all()
# 不等于
users = session.query(User).filter(User.name != "张三").all()
聚合查询
python
from sqlalchemy import func
# 计数
count = session.query(User).count()
# 分组计数
user_post_count = session.query(
User.name,
func.count(Post.id)
).join(Post).group_by(User.name).all()
# 求和、平均值等
avg_id = session.query(func.avg(User.id)).scalar()
连接查询
python
# 内连接
results = session.query(User, Post).join(Post).filter(Post.title.like("%Python%")).all()
# 左外连接
results = session.query(User, Post).outerjoin(Post).all()
# 指定连接条件
results = session.query(User, Post).join(Post, User.id == Post.author_id).all()
关系操作
python
# 创建带关系的对象
user = User(name="赵六", email="zhaoliu@example.com")
post = Post(title="我的第一篇博客", content="Hello World!", author=user)
session.add(post)
session.commit()
# 通过关系访问
print(f"文章 '{post.title}' 的作者是 {post.author.name}")
print(f"用户 {user.name} 的所有文章:")
for p in user.posts:
print(f" – {p.title}")
# 多对多关系操作
python_tag = Tag(name="Python")
sqlalchemy_tag = Tag(name="SQLAlchemy")
post.tags.append(python_tag)
post.tags.append(sqlalchemy_tag)
session.commit()
print(f"文章 '{post.title}' 的标签:")
for tag in post.tags:
print(f" – {tag.name}")
事务管理
python
# 自动提交事务
try:
user = User(name="测试用户", email="test@example.com")
session.add(user)
session.commit()
except Exception as e:
session.rollback()
print(f"发生错误: {e}")
# 使用事务上下文管理器
from sqlalchemy.orm import Session
def create_user(session: Session, name: str, email: str):
try:
user = User(name=name, email=email)
session.add(user)
session.commit()
return user
except:
session.rollback()
raise
# 嵌套事务
with session.begin_nested():
user = User(name="事务用户", email="transaction@example.com")
session.add(user)
# 保存点
savepoint = session.begin_nested()
try:
user = User(name="保存点用户", email="savepoint@example.com")
session.add(user)
savepoint.commit()
except:
savepoint.rollback()
最佳实践
会话管理:为每个请求创建新会话,请求结束后关闭
异常处理:始终处理异常并适当回滚事务
延迟加载:注意N+1查询问题,使用 eager loading 优化
连接池:合理配置连接池大小和超时设置
数据验证:在模型层或应用层验证数据完整性
python
# 使用上下文管理器管理会话
from contextlib import contextmanager
@contextmanager
def get_db():
db = SessionLocal()
try:
yield db
db.commit()
except Exception:
db.rollback()
raise
finally:
db.close()
# 使用示例
with get_db() as db:
user = User(name="上下文用户", email="context@example.com")
db.add(user)
总结
SQLAlchemy ORM提供了强大而灵活的数据库操作方式,通过本文的介绍,您应该能够:
安装和配置SQLAlchemy
定义数据模型和关系
执行基本的CRUD操作
构建复杂查询
管理数据库事务
遵循最佳实践
SQLAlchemy还有更多高级特性,如混合属性、事件监听、自定义查询等,值得进一步探索学习。
————————————————
https://github.com/gerkogrek/xfnh06/issues/2
https://github.com/qwretytu/u20d2p/issues/2
https://github.com/qwfew/yyoaq1/issues/2
https://github.com/wiwiwiiww/gss2eh/issues/2
https://github.com/ookhyuj/blqqm4/issues/1
https://github.com/ahhabawiw/hrwuo8/issues/2
https://github.com/fwefw41/800coy/issues/2
https://github.com/aiaiisuwuwq/i7p6z2/issues/2
https://github.com/frewbgerh/jd08l7/issues/1
https://github.com/gerkogrek/xfnh06/issues/1
https://github.com/qwretytu/u20d2p/issues/1
https://github.com/qwfew/yyoaq1/issues/1
https://github.com/wiwiwiiww/gss2eh/issues/1
https://github.com/fwefw41/800coy/issues/1
https://github.com/aiaiisuwuwq/i7p6z2/issues/1
https://github.com/ahhabawiw/hrwuo8/issues/1
https://github.com/hannbas/hjr8i/issues/103
https://github.com/hannbas/hjr8i/issues/102
https://github.com/hannbas/hjr8i/issues/101
https://github.com/hannbas/hjr8i/issues/100
https://github.com/hannbas/hjr8i/issues/99
https://github.com/hannbas/hjr8i/issues/98
https://github.com/hannbas/hjr8i/issues/97
https://github.com/hannbas/hjr8i/issues/96
https://github.com/hannbas/hjr8i/issues/95
https://github.com/hannbas/hjr8i/issues/94
https://github.com/hannbas/hjr8i/issues/93
https://github.com/hannbas/hjr8i/issues/92
https://github.com/hannbas/hjr8i/issues/91
https://github.com/hannbas/hjr8i/issues/90
https://github.com/hannbas/hjr8i/issues/89
https://github.com/hannbas/hjr8i/issues/88
https://github.com/hannbas/hjr8i/issues/87
https://github.com/hannbas/hjr8i/issues/86
https://github.com/hannbas/hjr8i/issues/85
https://github.com/hannbas/hjr8i/issues/84
https://github.com/hannbas/hjr8i/issues/83
https://github.com/hannbas/hjr8i/issues/82
https://github.com/hannbas/hjr8i/issues/81
https://github.com/hannbas/hjr8i/issues/80
https://github.com/hannbas/hjr8i/issues/79
https://github.com/hannbas/hjr8i/issues/78
https://github.com/hannbas/hjr8i/issues/77
https://github.com/hannbas/hjr8i/issues/76
https://github.com/hannbas/hjr8i/issues/75
https://github.com/hannbas/hjr8i/issues/74
https://github.com/hannbas/hjr8i/issues/73
https://github.com/hannbas/hjr8i/issues/72
https://github.com/hannbas/hjr8i/issues/71
https://github.com/hannbas/hjr8i/issues/70
https://github.com/hannbas/hjr8i/issues/69
https://github.com/hannbas/hjr8i/issues/68
https://github.com/hannbas/hjr8i/issues/67
https://github.com/hannbas/hjr8i/issues/66
https://github.com/hannbas/hjr8i/issues/65
https://github.com/hannbas/hjr8i/issues/64
https://github.com/hannbas/hjr8i/issues/63
https://github.com/hannbas/hjr8i/issues/62
https://github.com/hannbas/hjr8i/issues/61
https://github.com/hannbas/hjr8i/issues/60
https://github.com/hannbas/hjr8i/issues/59
https://github.com/hannbas/hjr8i/issues/58
https://github.com/hannbas/hjr8i/issues/57
https://github.com/hannbas/hjr8i/issues/56
https://github.com/hannbas/hjr8i/issues/55
https://github.com/hannbas/hjr8i/issues/54
https://github.com/hannbas/hjr8i/issues/53
https://github.com/hannbas/hjr8i/issues/52
https://github.com/hannbas/hjr8i/issues/51
https://github.com/hannbas/hjr8i/issues/50
https://github.com/hannbas/hjr8i/issues/49
https://github.com/hannbas/hjr8i/issues/48
https://github.com/hannbas/hjr8i/issues/47
https://github.com/hannbas/hjr8i/issues/46
https://github.com/hannbas/hjr8i/issues/45
https://github.com/hannbas/hjr8i/issues/44
https://github.com/hannbas/hjr8i/issues/43
https://github.com/hannbas/hjr8i/issues/42
https://github.com/hannbas/hjr8i/issues/40
https://github.com/hannbas/hjr8i/issues/41
https://github.com/hannbas/hjr8i/issues/39
https://github.com/hannbas/hjr8i/issues/38
https://github.com/hannbas/hjr8i/issues/37
https://github.com/hannbas/hjr8i/issues/36
https://github.com/hannbas/hjr8i/issues/35
https://github.com/hannbas/hjr8i/issues/34
https://github.com/hannbas/hjr8i/issues/33
https://github.com/hannbas/hjr8i/issues/32
https://github.com/hannbas/hjr8i/issues/31
https://github.com/hannbas/hjr8i/issues/30
https://github.com/hannbas/hjr8i/issues/29
https://github.com/hannbas/hjr8i/issues/28
https://github.com/hannbas/hjr8i/issues/27
https://github.com/hannbas/hjr8i/issues/26
https://github.com/hannbas/hjr8i/issues/25
https://github.com/hannbas/hjr8i/issues/24
https://github.com/hannbas/hjr8i/issues/23
https://github.com/hannbas/hjr8i/issues/22
https://github.com/hannbas/hjr8i/issues/21
https://github.com/hannbas/hjr8i/issues/20
https://github.com/hannbas/hjr8i/issues/19
https://github.com/hannbas/hjr8i/issues/18
https://github.com/hannbas/hjr8i/issues/17
https://github.com/hannbas/hjr8i/issues/16
https://github.com/hannbas/hjr8i/issues/15
https://github.com/hannbas/hjr8i/issues/14
https://github.com/hannbas/hjr8i/issues/13
https://github.com/hannbas/hjr8i/issues/12
https://github.com/hannbas/hjr8i/issues/11
https://github.com/hannbas/hjr8i/issues/10
https://github.com/hannbas/hjr8i/issues/9
https://github.com/hannbas/hjr8i/issues/8
https://github.com/hannbas/hjr8i/issues/7
https://github.com/hannbas/hjr8i/issues/6
https://github.com/hannbas/hjr8i/issues/5
https://github.com/hannbas/hjr8i/issues/4
https://github.com/hannbas/hjr8i/issues/3
https://github.com/hannbas/hjr8i/issues/2
https://github.com/hannbas/hjr8i/issues/1334
https://github.com/hannbas/hjr8i/issues/1333
https://github.com/hannbas/hjr8i/issues/1332
https://github.com/hannbas/hjr8i/issues/1331
https://github.com/hannbas/hjr8i/issues/1330
https://github.com/hannbas/hjr8i/issues/1329
https://github.com/hannbas/hjr8i/issues/1328
https://github.com/hannbas/hjr8i/issues/1327
https://github.com/hannbas/hjr8i/issues/1326
https://github.com/hannbas/hjr8i/issues/1325
https://github.com/hannbas/hjr8i/issues/1324
https://github.com/hannbas/hjr8i/issues/1323
https://github.com/hannbas/hjr8i/issues/1322
https://github.com/hannbas/hjr8i/issues/1321
https://github.com/hannbas/hjr8i/issues/1320
https://github.com/hannbas/hjr8i/issues/1319
https://github.com/hannbas/hjr8i/issues/1318
https://github.com/hannbas/hjr8i/issues/1317
https://github.com/hannbas/hjr8i/issues/1316
https://github.com/hannbas/hjr8i/issues/1315
https://github.com/hannbas/hjr8i/issues/1314
https://github.com/hannbas/hjr8i/issues/1313
https://github.com/hannbas/hjr8i/issues/1312
https://github.com/hannbas/hjr8i/issues/1311
https://github.com/hannbas/hjr8i/issues/1310
https://github.com/hannbas/hjr8i/issues/1309
https://github.com/hannbas/hjr8i/issues/1308
https://github.com/hannbas/hjr8i/issues/1307
https://github.com/hannbas/hjr8i/issues/1306
https://github.com/hannbas/hjr8i/issues/1305
https://github.com/hannbas/hjr8i/issues/1304
https://github.com/hannbas/hjr8i/issues/1303
https://github.com/hannbas/hjr8i/issues/1302
https://github.com/hannbas/hjr8i/issues/1301
https://github.com/hannbas/hjr8i/issues/1300
https://github.com/hannbas/hjr8i/issues/1299
https://github.com/hannbas/hjr8i/issues/1298
https://github.com/hannbas/hjr8i/issues/1297
https://github.com/hannbas/hjr8i/issues/1296
https://github.com/hannbas/hjr8i/issues/1295
https://github.com/hannbas/hjr8i/issues/1294
https://github.com/hannbas/hjr8i/issues/1293
https://github.com/hannbas/hjr8i/issues/1291
https://github.com/hannbas/hjr8i/issues/1292
https://github.com/hannbas/hjr8i/issues/1290
https://github.com/hannbas/hjr8i/issues/1289
https://github.com/hannbas/hjr8i/issues/1288
https://github.com/hannbas/hjr8i/issues/1287
https://github.com/hannbas/hjr8i/issues/1286
https://github.com/hannbas/hjr8i/issues/1285
https://github.com/hannbas/hjr8i/issues/1284
https://github.com/hannbas/hjr8i/issues/1283
https://github.com/hannbas/hjr8i/issues/1282
https://github.com/hannbas/hjr8i/issues/1281
https://github.com/hannbas/hjr8i/issues/1280
https://github.com/hannbas/hjr8i/issues/1279
https://github.com/hannbas/hjr8i/issues/1278
https://github.com/hannbas/hjr8i/issues/1277
https://github.com/hannbas/hjr8i/issues/1276
https://github.com/hannbas/hjr8i/issues/1275
https://github.com/hannbas/hjr8i/issues/1274
https://github.com/hannbas/hjr8i/issues/1273
https://github.com/hannbas/hjr8i/issues/1272
https://github.com/hannbas/hjr8i/issues/1271
https://github.com/hannbas/hjr8i/issues/1270
https://github.com/hannbas/hjr8i/issues/1269
https://github.com/hannbas/hjr8i/issues/1268
https://github.com/hannbas/hjr8i/issues/1267
https://github.com/hannbas/hjr8i/issues/1266
https://github.com/hannbas/hjr8i/issues/1265
https://github.com/hannbas/hjr8i/issues/1264
https://github.com/hannbas/hjr8i/issues/1263
https://github.com/hannbas/hjr8i/issues/1262
https://github.com/hannbas/hjr8i/issues/1261
https://github.com/hannbas/hjr8i/issues/1260
https://github.com/hannbas/hjr8i/issues/1259
https://github.com/hannbas/hjr8i/issues/1258
https://github.com/hannbas/hjr8i/issues/1257
https://github.com/hannbas/hjr8i/issues/1256
https://github.com/hannbas/hjr8i/issues/1255
https://github.com/hannbas/hjr8i/issues/1254
https://github.com/hannbas/hjr8i/issues/1253
https://github.com/hannbas/hjr8i/issues/1252
https://github.com/hannbas/hjr8i/issues/1251
https://github.com/hannbas/hjr8i/issues/1250
https://github.com/hannbas/hjr8i/issues/1249
https://github.com/hannbas/hjr8i/issues/1248
https://github.com/hannbas/hjr8i/issues/1247
https://github.com/hannbas/hjr8i/issues/1246
https://github.com/hannbas/hjr8i/issues/1245
https://github.com/hannbas/hjr8i/issues/1244
https://github.com/hannbas/hjr8i/issues/1243
https://github.com/hannbas/hjr8i/issues/1242
https://github.com/hannbas/hjr8i/issues/1241
https://github.com/hannbas/hjr8i/issues/1240
https://github.com/hannbas/hjr8i/issues/1239
https://github.com/hannbas/hjr8i/issues/1238
https://github.com/hannbas/hjr8i/issues/1237
https://github.com/hannbas/hjr8i/issues/1236
https://github.com/hannbas/hjr8i/issues/1235
https://github.com/hannbas/hjr8i/issues/1234
https://github.com/hannbas/hjr8i/issues/1233
https://github.com/hannbas/hjr8i/issues/1232
https://github.com/hannbas/hjr8i/issues/1231
https://github.com/hannbas/hjr8i/issues/1229
https://github.com/hannbas/hjr8i/issues/1230
https://github.com/hannbas/hjr8i/issues/1228
https://github.com/hannbas/hjr8i/issues/1227
https://github.com/hannbas/hjr8i/issues/1226
https://github.com/hannbas/hjr8i/issues/1225
https://github.com/hannbas/hjr8i/issues/1224
https://github.com/hannbas/hjr8i/issues/1223
https://github.com/hannbas/hjr8i/issues/1222
https://github.com/hannbas/hjr8i/issues/1221
https://github.com/hannbas/hjr8i/issues/1220
https://github.com/hannbas/hjr8i/issues/1219
https://github.com/hannbas/hjr8i/issues/1218
https://github.com/hannbas/hjr8i/issues/1217
https://github.com/hannbas/hjr8i/issues/1216
https://github.com/hannbas/hjr8i/issues/1215
https://github.com/hannbas/hjr8i/issues/1214
https://github.com/hannbas/hjr8i/issues/1213
https://github.com/hannbas/hjr8i/issues/1210
https://github.com/hannbas/hjr8i/issues/1211
https://github.com/hannbas/hjr8i/issues/1212
https://github.com/hannbas/hjr8i/issues/1209
https://github.com/hannbas/hjr8i/issues/1208
https://github.com/hannbas/hjr8i/issues/1207
https://github.com/hannbas/hjr8i/issues/1206
https://github.com/hannbas/hjr8i/issues/1205
https://github.com/hannbas/hjr8i/issues/1204
https://github.com/hannbas/hjr8i/issues/1203
https://github.com/hannbas/hjr8i/issues/1202
https://github.com/hannbas/hjr8i/issues/1201
https://github.com/hannbas/hjr8i/issues/1200
https://github.com/hannbas/hjr8i/issues/1199
https://github.com/hannbas/hjr8i/issues/1198
https://github.com/hannbas/hjr8i/issues/1197
https://github.com/hannbas/hjr8i/issues/1196
https://github.com/hannbas/hjr8i/issues/1195
https://github.com/hannbas/hjr8i/issues/1194
https://github.com/hannbas/hjr8i/issues/1193
https://github.com/hannbas/hjr8i/issues/1192
https://github.com/hannbas/hjr8i/issues/1191
https://github.com/hannbas/hjr8i/issues/1190
https://github.com/hannbas/hjr8i/issues/1189
https://github.com/hannbas/hjr8i/issues/1188
https://github.com/hannbas/hjr8i/issues/1187
https://github.com/hannbas/hjr8i/issues/1186
https://github.com/hannbas/hjr8i/issues/1185
https://github.com/hannbas/hjr8i/issues/1184
https://github.com/hannbas/hjr8i/issues/1183
https://github.com/hannbas/hjr8i/issues/1182
https://github.com/hannbas/hjr8i/issues/1181
https://github.com/hannbas/hjr8i/issues/1180
https://github.com/hannbas/hjr8i/issues/1179
https://github.com/hannbas/hjr8i/issues/1178
https://github.com/hannbas/hjr8i/issues/1177
https://github.com/hannbas/hjr8i/issues/1176
https://github.com/hannbas/hjr8i/issues/1175
https://github.com/hannbas/hjr8i/issues/1174
https://github.com/hannbas/hjr8i/issues/1173
https://github.com/hannbas/hjr8i/issues/1172
https://github.com/hannbas/hjr8i/issues/1171
https://github.com/hannbas/hjr8i/issues/1170
https://github.com/hannbas/hjr8i/issues/1169
https://github.com/hannbas/hjr8i/issues/1168
https://github.com/hannbas/hjr8i/issues/1167
https://github.com/hannbas/hjr8i/issues/1166
https://github.com/hannbas/hjr8i/issues/1165
https://github.com/hannbas/hjr8i/issues/1164
https://github.com/hannbas/hjr8i/issues/1163
https://github.com/hannbas/hjr8i/issues/1162
https://github.com/hannbas/hjr8i/issues/1161
https://github.com/hannbas/hjr8i/issues/1160
https://github.com/hannbas/hjr8i/issues/1159
https://github.com/hannbas/hjr8i/issues/1158
https://github.com/hannbas/hjr8i/issues/1157
https://github.com/hannbas/hjr8i/issues/1156
https://github.com/hannbas/hjr8i/issues/1155
https://github.com/hannbas/hjr8i/issues/1154
https://github.com/hannbas/hjr8i/issues/1153
https://github.com/hannbas/hjr8i/issues/1152
https://github.com/hannbas/hjr8i/issues/1151
https://github.com/hannbas/hjr8i/issues/1150
https://github.com/hannbas/hjr8i/issues/1149
https://github.com/hannbas/hjr8i/issues/1148
https://github.com/hannbas/hjr8i/issues/1147
https://github.com/hannbas/hjr8i/issues/1146
https://github.com/hannbas/hjr8i/issues/1145
https://github.com/hannbas/hjr8i/issues/1144
https://github.com/hannbas/hjr8i/issues/1143
https://github.com/hannbas/hjr8i/issues/1142
https://github.com/hannbas/hjr8i/issues/1141
https://github.com/hannbas/hjr8i/issues/1140
https://github.com/hannbas/hjr8i/issues/1139
https://github.com/hannbas/hjr8i/issues/1138
https://github.com/hannbas/hjr8i/issues/1137
https://github.com/hannbas/hjr8i/issues/1136
https://github.com/hannbas/hjr8i/issues/1135
https://github.com/hannbas/hjr8i/issues/1134
https://github.com/hannbas/hjr8i/issues/1133
https://github.com/hannbas/hjr8i/issues/1132
https://github.com/hannbas/hjr8i/issues/1131
https://github.com/hannbas/hjr8i/issues/1130
https://github.com/hannbas/hjr8i/issues/1129
https://github.com/hannbas/hjr8i/issues/1128
https://github.com/hannbas/hjr8i/issues/1127
https://github.com/hannbas/hjr8i/issues/1126
https://github.com/hannbas/hjr8i/issues/1125
https://github.com/hannbas/hjr8i/issues/1124
https://github.com/hannbas/hjr8i/issues/1123
https://github.com/hannbas/hjr8i/issues/1122
https://github.com/hannbas/hjr8i/issues/1121
https://github.com/hannbas/hjr8i/issues/1120
https://github.com/hannbas/hjr8i/issues/1119
https://github.com/hannbas/hjr8i/issues/1118
https://github.com/hannbas/hjr8i/issues/1117
https://github.com/hannbas/hjr8i/issues/1116
https://github.com/hannbas/hjr8i/issues/1115
https://github.com/hannbas/hjr8i/issues/1114
https://github.com/hannbas/hjr8i/issues/1113
https://github.com/hannbas/hjr8i/issues/1112
https://github.com/hannbas/hjr8i/issues/1111
https://github.com/hannbas/hjr8i/issues/1110
https://github.com/hannbas/hjr8i/issues/1109
https://github.com/hannbas/hjr8i/issues/1108
https://github.com/hannbas/hjr8i/issues/1107
https://github.com/hannbas/hjr8i/issues/1106
https://github.com/hannbas/hjr8i/issues/1105
https://github.com/hannbas/hjr8i/issues/1104
https://github.com/hannbas/hjr8i/issues/1103
https://github.com/hannbas/hjr8i/issues/1102
https://github.com/hannbas/hjr8i/issues/1101
https://github.com/hannbas/hjr8i/issues/1100
https://github.com/hannbas/hjr8i/issues/1099
https://github.com/hannbas/hjr8i/issues/1098
https://github.com/hannbas/hjr8i/issues/1097
https://github.com/hannbas/hjr8i/issues/1096
https://github.com/hannbas/hjr8i/issues/1095
https://github.com/hannbas/hjr8i/issues/1094
https://github.com/hannbas/hjr8i/issues/1093
https://github.com/hannbas/hjr8i/issues/1092
https://github.com/hannbas/hjr8i/issues/1091
https://github.com/hannbas/hjr8i/issues/1090
https://github.com/hannbas/hjr8i/issues/1089
https://github.com/hannbas/hjr8i/issues/1088
https://github.com/hannbas/hjr8i/issues/1087
https://github.com/hannbas/hjr8i/issues/1086
https://github.com/hannbas/hjr8i/issues/1085
https://github.com/hannbas/hjr8i/issues/1084
https://github.com/hannbas/hjr8i/issues/1083
https://github.com/hannbas/hjr8i/issues/1082
https://github.com/hannbas/hjr8i/issues/1081
https://github.com/hannbas/hjr8i/issues/1080
https://github.com/hannbas/hjr8i/issues/1079
https://github.com/hannbas/hjr8i/issues/1078
https://github.com/hannbas/hjr8i/issues/1077
https://github.com/hannbas/hjr8i/issues/1076
https://github.com/hannbas/hjr8i/issues/1075
https://github.com/hannbas/hjr8i/issues/1074
https://github.com/hannbas/hjr8i/issues/1073
https://github.com/hannbas/hjr8i/issues/1072
https://github.com/hannbas/hjr8i/issues/1071
https://github.com/hannbas/hjr8i/issues/1070
https://github.com/hannbas/hjr8i/issues/1069
https://github.com/hannbas/hjr8i/issues/1068
https://github.com/hannbas/hjr8i/issues/1067
https://github.com/hannbas/hjr8i/issues/1066
https://github.com/hannbas/hjr8i/issues/1065
https://github.com/hannbas/hjr8i/issues/1064
https://github.com/hannbas/hjr8i/issues/1063
https://github.com/hannbas/hjr8i/issues/1062
https://github.com/hannbas/hjr8i/issues/1061
https://github.com/hannbas/hjr8i/issues/1060
https://github.com/hannbas/hjr8i/issues/1059
https://github.com/hannbas/hjr8i/issues/1058
https://github.com/hannbas/hjr8i/issues/1057
https://github.com/hannbas/hjr8i/issues/1056
https://github.com/hannbas/hjr8i/issues/1055
https://github.com/hannbas/hjr8i/issues/1054
https://github.com/hannbas/hjr8i/issues/1053
https://github.com/hannbas/hjr8i/issues/1052
https://github.com/hannbas/hjr8i/issues/1051
https://github.com/hannbas/hjr8i/issues/1050
https://github.com/hannbas/hjr8i/issues/1049
https://github.com/hannbas/hjr8i/issues/1048
https://github.com/hannbas/hjr8i/issues/1047
https://github.com/hannbas/hjr8i/issues/1046
https://github.com/hannbas/hjr8i/issues/1045
https://github.com/hannbas/hjr8i/issues/1044
https://github.com/hannbas/hjr8i/issues/1043
https://github.com/hannbas/hjr8i/issues/1042
https://github.com/hannbas/hjr8i/issues/1041
https://github.com/hannbas/hjr8i/issues/1040
https://github.com/hannbas/hjr8i/issues/1039
https://github.com/hannbas/hjr8i/issues/1038
https://github.com/hannbas/hjr8i/issues/1037
https://github.com/hannbas/hjr8i/issues/1036
https://github.com/hannbas/hjr8i/issues/1035
https://github.com/hannbas/hjr8i/issues/1034
https://github.com/hannbas/hjr8i/issues/1033
https://github.com/hannbas/hjr8i/issues/1032
https://github.com/hannbas/hjr8i/issues/1031
https://github.com/hannbas/hjr8i/issues/1030
https://github.com/hannbas/hjr8i/issues/1029
https://github.com/hannbas/hjr8i/issues/1028
https://github.com/hannbas/hjr8i/issues/1027
https://github.com/hannbas/hjr8i/issues/1026
https://github.com/hannbas/hjr8i/issues/1025
https://github.com/hannbas/hjr8i/issues/1024
https://github.com/hannbas/hjr8i/issues/1023
https://github.com/hannbas/hjr8i/issues/1022
https://github.com/hannbas/hjr8i/issues/1021
https://github.com/hannbas/hjr8i/issues/1020
https://github.com/hannbas/hjr8i/issues/1019
https://github.com/hannbas/hjr8i/issues/1018
https://github.com/hannbas/hjr8i/issues/1017
https://github.com/hannbas/hjr8i/issues/1016
https://github.com/hannbas/hjr8i/issues/1015
https://github.com/hannbas/hjr8i/issues/1014
https://github.com/hannbas/hjr8i/issues/1013
https://github.com/hannbas/hjr8i/issues/1012
https://github.com/hannbas/hjr8i/issues/1011
https://github.com/hannbas/hjr8i/issues/1010
https://github.com/hannbas/hjr8i/issues/1009
https://github.com/hannbas/hjr8i/issues/1008
https://github.com/hannbas/hjr8i/issues/1006
https://github.com/hannbas/hjr8i/issues/1007
https://github.com/hannbas/hjr8i/issues/1005
https://github.com/hannbas/hjr8i/issues/1004
https://github.com/hannbas/hjr8i/issues/1003
https://github.com/hannbas/hjr8i/issues/1002
https://github.com/hannbas/hjr8i/issues/1001
https://github.com/hannbas/hjr8i/issues/1000
https://github.com/hannbas/hjr8i/issues/999
https://github.com/hannbas/hjr8i/issues/998
https://github.com/hannbas/hjr8i/issues/997
https://github.com/hannbas/hjr8i/issues/996
https://github.com/hannbas/hjr8i/issues/995
https://github.com/hannbas/hjr8i/issues/994
https://github.com/hannbas/hjr8i/issues/993
https://github.com/hannbas/hjr8i/issues/992
https://github.com/hannbas/hjr8i/issues/991
https://github.com/hannbas/hjr8i/issues/990
https://github.com/hannbas/hjr8i/issues/989
https://github.com/hannbas/hjr8i/issues/988
https://github.com/hannbas/hjr8i/issues/987
https://github.com/hannbas/hjr8i/issues/986
https://github.com/hannbas/hjr8i/issues/985
https://github.com/hannbas/hjr8i/issues/984
https://github.com/hannbas/hjr8i/issues/983
https://github.com/hannbas/hjr8i/issues/982
https://github.com/hannbas/hjr8i/issues/981
https://github.com/hannbas/hjr8i/issues/980
https://github.com/hannbas/hjr8i/issues/979
https://github.com/hannbas/hjr8i/issues/978
https://github.com/hannbas/hjr8i/issues/977
https://github.com/hannbas/hjr8i/issues/976
https://github.com/hannbas/hjr8i/issues/975
https://github.com/hannbas/hjr8i/issues/974
https://github.com/hannbas/hjr8i/issues/973
https://github.com/hannbas/hjr8i/issues/972
https://github.com/hannbas/hjr8i/issues/971
https://github.com/hannbas/hjr8i/issues/970
https://github.com/hannbas/hjr8i/issues/969
https://github.com/hannbas/hjr8i/issues/968
https://github.com/hannbas/hjr8i/issues/967
https://github.com/hannbas/hjr8i/issues/966
https://github.com/hannbas/hjr8i/issues/965
https://github.com/hannbas/hjr8i/issues/964
https://github.com/hannbas/hjr8i/issues/963
https://github.com/hannbas/hjr8i/issues/962
https://github.com/hannbas/hjr8i/issues/961
https://github.com/hannbas/hjr8i/issues/960
https://github.com/hannbas/hjr8i/issues/959
https://github.com/hannbas/hjr8i/issues/958
https://github.com/hannbas/hjr8i/issues/957
https://github.com/hannbas/hjr8i/issues/956
https://github.com/hannbas/hjr8i/issues/955
https://github.com/hannbas/hjr8i/issues/954
https://github.com/hannbas/hjr8i/issues/953
https://github.com/hannbas/hjr8i/issues/952
https://github.com/hannbas/hjr8i/issues/951
https://github.com/hannbas/hjr8i/issues/950
https://github.com/hannbas/hjr8i/issues/949
https://github.com/hannbas/hjr8i/issues/948


