1.https://www.baidu.com/link?url=YPRHwbVIUWG08RvvQnigWIDAwO6ml61SQwnA2KyQkSwKe0Djcp2NNOkXKz422GNL&wd=&eqid=bdd8b5890004f6e6000000025e6b42c8
安装方法
pip install SQLAlchemy
from sqlalchemy importcreate_enginefrom sqlalchemy.ext.declarative importdeclarative_basefrom sqlalchemy importColumn, Integer, String ,DateTime, Boolean#连接数据库
engine = create_engine('mysql://root:password@localhost:3306/school?charset=utf8')## 编码问题
## 获取基类
Base =declarative_base()class News(Base): #继承基类
__tablename__ = 'students1'id= Column(Integer, primary_key =True)
nickname= Column(String(20))
name= Column(String(20), nullable =False)
sex= Column(String(1))
in_time=Column(DateTime)
is_vaild=Column(Boolean)
idcard= Column(Integer, unique =True)
News.metadata.create_all(engine)#创建表格
## 新增数据
from sqlalchemy.orm importsessionmaker
Session= sessionmaker(bind=engine)classOrmTest(object):def __init__(self):
self.session=Session()defadd_one(self):
new_obj=News(
nickname= '123',
name= '321',
sex= '男',
)
self.session.add(new_obj)
self.session.commit()returnnew_objdefadd_more(self):
new_obj=News(
nickname= '123',
name= '321',
sex= '男',
)
new_obj2=News(
nickname= 'wei',
name= 'lai',
sex= '女',
)
self.session.add_all([new_obj,
new_obj2])
self.session.commit()returnnew_obj## 查询数据
defget_one(self):return self.session.query(News).get(10) #get 是选id为2的
defget_more(self):return self.session.query(News).filter_by(is_vaild=True)## 修改数据## 将一条当作多条的一种情况
defupdate_data(self):
data_list= self.session.query(News).filter(News.id >= 5)for item indata_list:ifitem:
item.is_vaild=0
self.session.add(item)#加入
self.session.commit() #提交## filter 与 filter_by 的区别
## 删除数据
defdelete_data(self):
data= self.session.query(News).get(8)ifdata:
self.session.delete(data)
self.session.commit()else:returnFalsedefdelete_data_more(self):
delete_list= self.session.query(News).filter(News.id <= 5)for item indelete_list:ifitem:
self.session.delete(item)else:returnFalse
self.session.commit()defmain():
obj=OrmTest()
obj.add_one()
obj.add_more()
data=obj.get_one()## 防止查询失误
ifdata:print('ID:{0} {1}'.format(data.id,data.sex))else:print('Not exist')
data_more=obj.get_more()print(data_more.count()) #计数
for new_obj indata_more:print('ID:{0} {1} {2} {3}'.format(new_obj.id,new_obj.sex,new_obj.name,new_obj.nickname))
obj.update_data()print('数据修改成功')
obj.delete_data()print('数据删除成功')
obj.delete_data_more()if __name__ == '__main__':
main()
2.https://www.cnblogs.com/iexperience/p/9511462.html
ORM 对象映射关系程序。
通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不用直接使用sql语言。
orm的优点:
隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
ORM使我们构造固化数据结构变得简单易行。
缺点:
无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
最有名的ORM框架是SQLAlchemy,系统中没有该模块的需要安装 pip install sqlalchemy (或easy_install SQLAlchemy)
如果在pip install sqlalchemy 中报ReadTimeoutError: HTTPSConnectionPool(host='files.pythonhosted.org'错,需要先设置超时时间:pip --default-timeout=100 install -U Pillow,再重新安装 pip install sqlalchemy,通过imort sqlalchemy验证是否安装正常。
ORM框架SQLAlchemy 使用,创建表:
注:pymysql设置编码字符集一定要在数据库访问的URL上增加?charset=utf8,否则数据库的连接就不是utf8的编码格式
ORM框架SQLAlchemy 使用,插入数据:
结果:
查询:
结果:
修改:
结果:
参考数据表:
回滚:
结果:
获取所有数据
结果:
多条件查询
filter的关系相当于 user.id >0 AND user.id <=3 的效果
结果:
统计和分组
结果:
结果:
外键关联
参照表:两张表是一对多的关系。
addresses(多)
创建表addresses,将users表中的id作为addresses表的外键。
结果:
输出的结果1是列表形式,print 多行记录时以列表的形式显示。
注:在定义表的类下面加 def __repr__(self):return ... 是为了在print时输出哪些数据,以及输出后的显示形式。
补充:1.主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性
2.外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的。所以说,如果谈到了外键,一定是至少涉及到两张表。例如下面这两张表:
设定条件向指定表中添加记录:
结果:
多外键关联
在Customer表有2个字段都关联了Address表
如果报错:
sqlalchemy.exc.AmbiguousForeignKeysError: Couldnot determine join