sqlalchemy是python 中最有名的ORM(Object-Relational Mapping)框架之一,用于连接并操作数据库。
由于我需要引用了pandas来处理数据,若需要保存,希望能以常用的Dataframe格式来保存,而不想转换后再逐行保存。不过尝试过mysql.connector等不少框架,都无法实现,选来选去,只有sqlalchemy才相对比较好用。
前提:已建好库
使用的一般步骤:
1、创建连接:create_engine()
2、声明映射文件
2.1 创建基类:declarative_base()
2.2 定义表格对象类:class classname(baseclass):
2.3 指定表名:__tablename__
若要建表:
2.4 定义表结构:
class test1(Base):
__tablename__ = 'test'
id = Column(Integer,primary_key=True)
name = Column(String(10))
info = Column(String(10))
2.5 建表:test1.metadata.create_all(engine)
若要插入数据:
2.4 创建会话并提交:
2.4.1 创建会话对象:DBSession= sessionmaker(bind=engine)
2.4.2 实例化会话对象:session= DBSession()
2.4.3 实例化表格对象:new_share= test1(id='01',name='hhhh',info='哈哈哈')
2.4.4 将实例化的表格参数添加到会话等待提交:session.add(new_share)
2.4.5 提交会话:session.commit()
2.4.6 关闭会话:session.close()
若要查询数据:
2.4 创建会话:
2.4.1 创建会话对象:DBSession= sessionmaker(bind=engine)
2.4.2 实例化会话对象:session= DBSession()
2.4.3 构建查询语句:test= session.query(test1).filter(test1.id=='01').one()
2.5 查询结果是一个表格对象,需要看对应列的值:print(test.name)
注:除了以上的方法,还有其他的方法可以直接进行创建表格、插入数据、查询数据等操作。先将其摘录如下
具体方法可参考:https://www.jianshu.com/p/2f07258ffc98
作者:谢小路 链接:https://www.jianshu.com/p/2f07258ffc98 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
创建数据表的其他方式
from sqlalchemy import Table, MetaData, create_engine
engine = create_engine("mysql+mysqlconnector://root:123456@localhost:3306/test") metadata = MetaData()
t1 = Table('users', metadata, Column('id',INT, primary_key=True), Column('name', String(20)), Column('fullname', String(50)), Column('password', String(20)) )
t2 = Table('address', metadata, Column('id',INT, primary_key = True), Column('email_address',String(50), nullable=False), Column('user_id', INT, ForeignKey('users.id')) ) metadata.create_all(engine)
# 创建两个数据表分别为users 和 address
插入数据的其他方式
# 在建立的会话基础上执行sql语句
session.execute('insert into users values(2,"Bob","budian")')
session.commit()
# 使用映射类成员变量的数据
user = User(id="3", name="alice", password="hgf")
session.add(user) session.commit()
查询操作
users = session.query(User).all()# 返回数据表所有数据
修改数据
# 在会话的基础上执行sql语句
session.execute('update addresses set user_id = 1 where id = 2')
session.commit()
# 使用映射类成员变量的数据
session.query(Address).filter(Address.id ==2).update({"user_id":1})
下面是在使用的时候踩到的坑,这个问题解决之后,就一路坦途了。
报错如下:
sqlalchemy.exc.NotSupportedError: (mysql.connector.errors.NotSupportedError) Authentication plugin 'caching_sha2_password' is not supported
create_engine的时候没有报错,在你创建表test1.metadata.create_all(engine) 的时候,报错了,是因为mysql.connector的引擎不支持caching_sha2_password的加密格式
有几种解决方法:
1、在client端,将加密格式选择成mysql_native_password
2、将服务单的加密格式改成mysql_native_password
3、将用户登录的规则改为mysql_native_password,不过写在程序中不方便
4、按照官方文档中的描述,加上use_pure=False,不过试了下,不管用
最后决定选择1,重新输入密码,选择下图红框中的选项,然后重启mysql,搞定:
网友评论