美文网首页我爱编程
使用sqlalchemy增、删、改、查

使用sqlalchemy增、删、改、查

作者: 海37度思念 | 来源:发表于2018-05-26 17:13 被阅读1121次

    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,搞定:

    相关文章

      网友评论

        本文标题:使用sqlalchemy增、删、改、查

        本文链接:https://www.haomeiwen.com/subject/grqadftx.html