zoukankan      html  css  js  c++  java
  • Python使用SQLAlchemy连接数据库CRUD

    2021.1.17补充SQLAlchemy文档:https://docs.sqlalchemy.org/en/13/orm/tutorial.html

    1.从源头上说起

    数据库表是一个二维表,包含多行多列。

    把一个表的内容用Python的数据结构表示出来的话,可以用一个list表示多行,list的每一个元素是tuple,表示一行记录,比如,包含idnameuser表:

    [
        ('1', 'Michael'),
        ('2', 'Bob'),
        ('3', 'Adam')
    ]
    

    Python的DB-API返回的数据结构就是像上面这样表示的。

    但是用tuple表示一行很难看出表的结构。

    如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:

    class User(object):
        def __init__(self, id, name):
            self.id = id
            self.name = name
    
    [
        User('1', 'Michael'),
        User('2', 'Bob'),
        User('3', 'Adam')
    ]
    

    这就是传说中的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上。

    但是由谁来做这个转换呢?所以ORM框架应运而生。

    在Python中,最有名的ORM框架是SQLAlchemy。

    SQLAlchemy是Python用来操作数据库的一个库,该库提供了SQL工具包及对象关系映射(ORM)工具。

    数据库的记录用Python的数据结构来表现,可以看做一个列表,每条记录是列表中的一个元组。

    参考内容:https://www.liaoxuefeng.com/wiki/1016959663602400/1017803857459008、https://www.cnblogs.com/zhuozige/p/13131886.html

    小结:把二维的数据库表用Python的数据结构表示出来是list套tuple,通过把关系数据库的表结构映射到对象上的ORM技术让表结构清晰表达,完成转换工作的就是ORM框架了。Python中最有名的ORM框架便是SQLAlchemy。

    2.SQLAlchemy基本用法

    对SQLAlchemy有了基本的认识,接下来就要对SQLAlchemy的用法进行学习。

    1)导入SQLAlchemy,并初始化DBSession

    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    # 创建对象的基类
    Base = declarative_base()
    # 定义User对象
    class User(Base):
      __tablename__ = 'User'
      id = Column(String(20), primary_key=True)
      name = Column(String(20))
    engine = create_engine('mysql+pymysql://root:root@localhost:3306/test')
    # 创建DBSession类型 
    DBSession = sessionmaker(bind=engine)

     逐一分析每个关键词:

    from sqlalchemy import Column, String, create_engine

    Column:字面解释是“列”

    常用参数

    default:默认值

    nullable:是否可有

    primary_key:是否为主键

    unique:是否唯一

    autoincrement:是否自动增长

    onupdate:更新的时候执行的函数

    name:该属性在数据库中的字段映射

    String:字符串类型

    sqlalchemy常用数据类型:

    Integer:整形

    Float:浮点类型

    Boolean:传递True/False

    DECIMAL:定点类型

    enum:枚举类型

    Date:传递datetime.date()进去

    Time:传递datatime.time()

    String:字符类型,使用时需要指定长度,区别于Text类型

    Text:文本类型

    LONGTEXT:长文本类型

    create_engine:字面解释“创建引擎”

    用法 

    engine = create_engine('dialect+driver://username:password@host:port/database')

    dialect -- 数据库类型

    driver -- 数据库驱动选择

    username -- 数据库用户名

    password -- 用户密码

    host -- 服务器地址

    port -- 端口

    database -- 数据库

    from sqlalchemy.orm import sessionmaker

    sessionmaker:通过sessionmaker,我们得到一个类,一个能产生session的工厂。我们可以用这个类的对象来操作数据库。

    例如:DBSession = sessionmaker(bind=engine)

    from sqlalchemy.ext.declarative import declarative_base

     declarative_base:是一个工厂函数,它为声明性类定义构造基类。

    例如:Base = declarative_base()

    未完.....

    在实际连接数据库的时候,Column()中的primary_key设置为空或者等于False的情况下,程序会报错

    源码如下:

    from sqlalchemy import Column, String, create_engine
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    
    Base = declarative_base()
    
    class User(Base):
        __tablename__ = 'User'
        id = Column(String(20), primary_key=False)
    # id = Column(String(20)) name
    = Column(String(20)) engine = create_engine('mysql+pymysql://root:root@localhost:3306/test') if engine: print('连接成功') DBSession = sessionmaker(bind=engine) session = DBSession() user = session.query(User).filter(User.id=='1').one() print('name:',user.name)

    错误如下:

    sqlalchemy.exc.ArgumentError: Mapper mapped class User->User could not assemble any primary key columns for mapped table 'User'

    谷歌翻译:sqlalchemy.exc.ArgumentError(实参错误):映射器映射的类User-> User无法为映射表'User'组装任何主键列

  • 相关阅读:
    Linux下Redis集群环境的搭建
    redis: 6379端口下set值时出现 CLUSTERDOWN The cluster is down
    运行Maven工程总是报错:No goals have been specified for this build
    Centos6.5 配置Nginx开机自启动
    centos6.5无法访问网络
    centos6.5 nginx-1.8.0和ftp搭建图片服务器
    HTML中使图片居中显示
    使用InstallAnywhere工具打包Java_Web程序
    Android开发中Parcelable接口的使用方法
    Java8并行流使用注意事项
  • 原文地址:https://www.cnblogs.com/lncyc/p/14259165.html
Copyright © 2011-2022 走看看