sqlalchemy你必须得会

2022-06-17 08:24:25 浏览数 (1)

什么是 sqlalchemy?

sqlalchemyPython 的一个优秀的开源 ORM 框架。为开发者提供了方便快捷的 API,能够提高开发效率,让开发者专心于业务代码开发,而非浪费时间在数据库的维护上。今天我们就来一起了解下 sqlalchemy 的基本用法。

什么是 SQLite?

SQLite 是一款超轻的关系型数据库,其实际就是一个 .db 文件,通常我们在测试环境中可以方便快捷的使用它,另部分企业也将其用在生产环境中。总之他是一款优秀的数据库。

安装

安装 sqlalchemy

代码语言:javascript复制
pip install sqlalchemy

安装 SQLitebrowser

代码语言:javascript复制
下载地址:http://www.sqlitebrowser.org/dl/

选择合适自己的下载即可。

例子

创建数据库&表

代码语言:javascript复制
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Boolean,Column,Integer,String


# 定义数据库路径(不存在会自动创建)
SQLiteURL = 'sqlite:///test.db'

# 创建engine,即数据库驱动信息
engine = create_engine(
    url=SQLiteURL,
    echo=True,    # 打开sqlalchemy ORM过程中的详细信息
    connect_args={
        'check_same_thread':False   # 是否多线程
    }
)

# 数据表的基类(定义表结构用)
Base = declarative_base()

# 定义User表结构

class User(Base):
    # User类对象对应表users
    __tablename__='users'
    my_id = Column(Integer,primary_key=True,index=True)
    name = Column(String(32),unique=True,index=True)
    passwd = Column(String(32),index=True)
    is_active = Column(Boolean,default=True)

# 创建表
# checkfirst=True 默认也是 True,即如果数据库存在则不再创建
Base.metadata.create_all(engine, checkfirst=True)

执行以上代码:

代码语言:javascript复制
PS C:UsersxxDesktopstudy2> python .orm.py
2021-07-12 17:23:06,010 INFO sqlalchemy.engine.Engine BEGIN (implicit)
2021-07-12 17:23:06,010 INFO sqlalchemy.engine.Engine PRAGMA main.table_info("users")
2021-07-12 17:23:06,011 INFO sqlalchemy.engine.Engine [raw sql] ()
2021-07-12 17:23:06,011 INFO sqlalchemy.engine.Engine PRAGMA temp.table_info("users")
2021-07-12 17:23:06,011 INFO sqlalchemy.engine.Engine [raw sql] ()
2021-07-12 17:23:06,012 INFO sqlalchemy.engine.Engine
CREATE TABLE users (
        my_id INTEGER NOT NULL,
        name VARCHAR(32),
        passwd VARCHAR(32),
        is_active BOOLEAN,
        PRIMARY KEY (my_id)
)


2021-07-12 17:23:06,012 INFO sqlalchemy.engine.Engine [no key 0.00047s] ()
2021-07-12 17:23:06,026 INFO sqlalchemy.engine.Engine CREATE INDEX ix_users_my_id ON users (my_id)
2021-07-12 17:23:06,027 INFO sqlalchemy.engine.Engine [no key 0.00029s] ()
2021-07-12 17:23:06,030 INFO sqlalchemy.engine.Engine CREATE INDEX ix_users_passwd ON users (passwd)
2021-07-12 17:23:06,030 INFO sqlalchemy.engine.Engine [no key 0.00025s] ()
2021-07-12 17:23:06,033 INFO sqlalchemy.engine.Engine CREATE UNIQUE INDEX ix_users_name ON users (name)
2021-07-12 17:23:06,034 INFO sqlalchemy.engine.Engine [no key 0.00040s] ()
2021-07-12 17:23:06,037 INFO sqlalchemy.engine.Engine COMMIT
PS C:UsersxxDesktopstudy2>

代码所在路径下生成了 test.db

test.dbSQLitebrowser 中的视图:

数据创建 Add

代码语言:javascript复制
# 创建session类对象(建立和数据库的链接)
SessionLocal = sessionmaker(
    bind=engine,
    autoflush=False,
    autocommit=False
)

# 创建session实例(实例化)
db = SessionLocal()

# 创建新的User类实例

phyger = User(
    my_id = 1,
    name = 'phyger',
    passwd = 'pwd@123'
)

# 将phyger实例插入users表中

db.add(phyger)

# 提交后才算正式插入数据
db.commit()

# 关闭数据库连接
db.close()

执行代码后去 SQLitebrowser 中查看:

数据查询 Query

代码语言:javascript复制
# 创建session类对象(建立和数据库的链接)
SessionLocal = sessionmaker(
    bind=engine,
    autoflush=False,
    autocommit=False
)

# 创建session实例(实例化)
db = SessionLocal()

# 查询数据

res = db.query(User).all()
print(res)

# 条件查询
user1 = db.query(User).filter_by(my_id=1).first()
print(user1)

# 关闭数据库连接
db.close()

代码执行结果:

你会发现,日志中打印了实际执行的 SQL 语句,也将查询到的信息展示了出来。更多过滤条件可查看官方文档。

数据更新

代码语言:javascript复制
# 创建session类对象(建立和数据库的链接)
SessionLocal = sessionmaker(
    bind=engine,
    autoflush=False,
    autocommit=False
)

# 创建session实例(实例化)
db = SessionLocal()

# 更新数据

user1.name = 'flyGg'

db.commit()

# 更新后查询
user2 = db.query(User).filter_by(my_id=1).first()

print(user2.name)

# 关闭数据库连接
db.close()

数据删除 Delete

为方便演示,我们又添加了一条信息 phyger2

代码语言:javascript复制
# 创建session类对象(建立和数据库的链接)
SessionLocal = sessionmaker(
    bind=engine,
    autoflush=False,
    autocommit=False
)

# 创建session实例(实例化)
db = SessionLocal()

# 删除数据

user3 = db.query(User).filter_by(my_id=1).first()
db.delete(user3)
db.commit()

# 关闭数据库连接
db.close()

参考:https://www.cnblogs.com/lsdb/p/9835894.html

以上就是今天的全部内容了,感谢您的阅读,我们下节再会。

0 人点赞