最近在学习sqlalchemy和click,就想有没有办法将这两个库联合起来做个model。最终我实现了在命令行中用自己的定义的命令对mysql进行操作。 虽然听起来舍近求远,傻傻的,直接用sql不行就行了嘛,没啥实用价值。但纯粹就是为了来练手嘛!!
直接上代码,安上包,换个数据库id就能运行。
from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
import click
Base = declarative_base()
engine = create_engine("mysql+pymysql://root:123456@localhost:3306/sql_click_model", echo=True)
Session = sessionmaker(bind=engine)
session = Session()
class Friend(Base):
__tablename__ = "friend"
id = Column(Integer, primary_key=True)
name = Column(String(20), default=None, nullable=False, comment="name")
phone = Column(String(20), default=None, comment="phone", nullable=False)
def __repr__(self):
Name = self.name
Phone = self.phone
return f"Friend:name: {Name},phone: {Phone}"
Base.metadata.create_all(engine)
@click.group()
def cli():
pass
@click.command()
@click.option('--name', prompt="请输入联系人姓名", help='联系人姓名', type=str, required=True)
@click.option('--phone', prompt="请输入联系人电话", help='联系人电话', type=str, required=True)
def Add(name, phone):
NewFriend = Friend(name=name, phone=phone)
session.add(NewFriend)
session.commit()
@click.command()
@click.option('--name', prompt="请输入要删除的联系人姓名", help='联系人姓名', type=str, required=True)
def Delete(name):
friend = session.query(Friend).filter(Friend.name == name).first()
session.delete(friend)
session.commit()
@click.command()
@click.option('--name', prompt="请输入联系人姓名", help='联系人姓名', type=str, required=True)
@click.option('--phone', prompt="请输入联系人电话", help='联系人电话', type=str, required=True)
def Update(name, phone):
friend = session.query(Friend).filter(Friend.name == name).first()
friend.phone = phone
session.add(friend)
session.commit()
@click.command()
@click.option('--name', prompt="请输入联系人姓名", help='联系人姓名', type=str, required=True)
def Find(name):
friend = session.query(Friend).filter(Friend.name == name).first()
print(f"用户{name}的手机号为{friend.phone}")
@click.command()
def See_all():
results = session.execute("""select *from friend;""")
for result in results:
print(result)
cli.add_command(Add)
cli.add_command(Delete)
cli.add_command(Update)
cli.add_command(Find)
cli.add_command(See_all)
if __name__ == '__main__':
cli()