中心线

一个热爱“自由”的笔记博客

SQLAlchemy 实例代码,Python命令行实现增删改查功能

| 1 Comment

本文代码实现了用Python和SQLAlchemy以命令行方式操作数据库增删改查功能。这里使用的数据库是 PostgreSQL,所以需要首先安装 psycopg2 模块。通过本代码可以让你对SQLAlchemy 的使用有一个相对明了的认识,本文介绍了如何使用SQLAlchemy 创建数据表,并实现对数据库的增加数据、删除数据、查询数据、修改数据。

安装 psycopg2


pip install psycopg2

创建数据表结构(数据模型)


文件1:models.py

'''
# SQLALchemy 模块使用 Example 1
'''
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import (
    Column, Integer, String, DateTime, BIGINT, Text,ForeignKey)
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, relationship


# 数据库 URI
db_url = 'postgresql+psycopg2://u_zsf:iiii@localhost:5432/testdb3'
# 链接引擎
engine = create_engine(db_url)
# 元类
ModelBase = declarative_base()
# 会话
Session = sessionmaker(bind=engine)


class User(ModelBase):
    __tablename__ = 'auth_user'
    id = Column(BIGINT, primary_key=True, autoincrement=True)
    date_joined = Column(DateTime)
    username = Column(String(length=30), server_default='', nullable=False,
        index=True)
    password = Column(String(length=128), server_default='', nullable=False)

    def __repr__(self):
        return "<User(username='%r', date_joined='%r', password='r')" % (
            self.username, self.date_joined, self.password)

数据库命令行交互代码


文件2:main.py

from models import User, engine, ModelBase, Session

# 创建会话实例
session = Session()

def createUser(username, join_date, password):
    user = User(username=username, date_joined=join_date, password=password)
    session.add(user)
    session.commit()

def deleteUser(username):
    user = session.query(User).filter(User.username == username).first()
    session.delete(user)
    session.commit()

def getUser(username):
    user = session.query(User).filter_by(username=username).first()
    return user

def getAll():
    all_user = session.query(User).filter()
    return all_user

def editUser(username):
    user = session.query(User).filter_by(username=username).first()

    while True:
        options = input('请输入要编辑的选项((1)->修改用户名(2)->修改密码):')
        if options == '1':
            user.username = input('请输入新的用户名:')
            yesNo = input('用户名已更改,你要保存码Y/n')
            if yesNo == 'Y' or yesNo == 'y':
                session.commit()
            elif yesNo == 'N' or yesNo == 'n':
                session.rollback()
        elif options == '2':
            user.password = input('请输入新密码:')
            yesNo = input('密码已更新,你要保存吗Y/n')
            if yesNo == 'Y' or yesNo == 'y':
                session.commit()
            elif yesNo == 'N' or yesNo == 'n':
                session.rollback()
        exitFlag = input('您要退出编辑吗Y/n')
        if exitFlag == 'Y' or exitFlag == 'y':
            break

def getUserCount():
    userCount = session.query(User).count()
    return userCount

while True:
    options = input(
        "//C:创建用户 | D:删除用户 | SD:查询单个用户 | ALL:查询所有用户 | num:查询用户量 | Q:退出//\n>>>"
    )
    if options == 'C' or options == 'c':
        username = input('请输入用户名:')
        date_joined = input('请输入日期格式/(2010-12-23):')
        password = input('请输入密码:')
        createUser(username=username, join_date=date_joined, password=password)
    elif options == 'D' or options == 'd':
        user = input('请输入要删除的用户名:')
        deleteUser(user)
    elif options == 'E' or options == 'e':
        user = input('请输入要编辑的用户名:')
        editUser(user)
    elif options == 'SD' or options == 'sd':
        username = input('请输入要查询的用户名')
        user = getUser(username)
        print("\nusername: %s\njoined_date: %s\npassword: %s\n" % (
            user.username, user.date_joined, user.password))
    elif options == 'ALL' or options == 'all':
        for user in getAll():
            print("\nusername: %s\njoined_date: %s\npassword: %s\n" % (
            user.username, user.date_joined, user.password))
    elif options == 'NUM' or options == 'num':
        print('用户数量: %s\n' % getUserCount())
    elif options == 'Q' or options == 'q':
        session.close()
        break

把数据表创建到数据库


代码已经编写完毕,在运行交互程序main.py之前需要先把数据表创建到数据库,目前数据库中还是空的,执行一下代码后数据库中就会出现数据表 “auth_user” 。

from models import ModelBase, engine

ModelBase.metadata.create_all(engine)

把数据库 URI 改成自己的数据库地址


SQLAlchemy 支持不同的数据库,同样每种数据库都有对应的驱动模块,下列列出了一些例子。

格式如下:

engine = create_engine(‘数据库+驱动://username:password@数据库地址:端口/数据库名’)

SQLite3

engine = create_engine('sqlite:///:memory:', echo=True) # 使用 sqlite3

PostgreSQL

一下是PostgreSQL数据库支持的Python驱动。

  • psycopg2
  • pg8000
  • psycopg2cffi
  • py-postgresql
  • pygresql
  • zxJDBC for Jython

SQLAlchemy 官网


PostgreSQL 官网


https://www.postgresql.org/

完!

除非注明,否则均为中心线原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.z10.xin/archives/282

One Comment

  1. Pingback: 分享一个用SQLALchemy 实现的命令行版博客程序 – 中心线

发表评论

Required fields are marked *.