python ORM - sqlalchemy 操作使用
Posted 捉急的名字
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python ORM - sqlalchemy 操作使用相关的知识,希望对你有一定的参考价值。
python操作数据库
使用 ORM - sqlalchemy,pymsql
安装:
pip install pymsq
pip install sqlalchemy
一、 \'\'\'连接数据库\'\'\'
\'\'\'导入必须的包\'\'\'
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 基本设置
HOSTNAME = \'127.0.0.1\' # 本地 liunx
POST = \'3306\' # mysql 默认端口
DATABASE = \'mydb\' # 数据库名字
USERNAME = \'admin\' # 用户名
PASSWORD = \'Root110qwe\' # 密码
# 固定写法
db_url = \'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8\'.format( USERNAME, PASSWORD, HOSTNAME, POST, DATABASE )
# 这里的 db_url 就是连接数据库的路径。“mysql+mysqldb”指定了使用 MySQL-Python 来连
engine = create_engine(db_url,echo=False) # 初始化数据库连接,
# create_engine() 会返回一个数据库引擎,echo 参数为 True 时,会显示每条执行的 SQL 语句,生产环境下可关闭。
Base = declarative_base(engine)Session = sessionmaker(engine)
# 创建对象的基类
# 创建与数据库连接的Session类
session = Session()
# session可以视为数据库连接
# sessionmaker() 会生成一个数据库会话类。这个类的实例可以当成一个数据库连接,它同时还记录了一些查询的数据,并决定什么时候执行 SQL 语句。
if __name__ == \'__main__\': # 测试是否连接成功
connection = engine.connect()
result = connection.execute(\'select 1\')
print(result.fetchone())
二 、 \'\'\'创建 类—表 映射关系\'\'\'
创建表的同时,也映射数据库;也可以单独创建表,
# -*- coding:utf-8 -*-
from datetime import datetime
from sqlalchemy import Column,Integer,String,DateTime
from connect import Base,session # 这里connect前面加上点之后 不能直接执行文件,但是可以外部调用
\'\'\'创建表 user \'\'\'
class User(Base):
__tablename__ = \'user\'
id = Column(Integer,primary_key=True,autoincrement=True) #主键 ,自增长
username = Column(String(20),nullable=False) # 用户名长度 20 、非空
password = Column(String(50)) # 密码长度 50
creatime = Column(DateTime,default=datetime.now) # 创建时间
@classmethod
def by_name(cls,name): # 定义查询函数,返回查询结果
return session.query(cls).filter(cls.username==name).first()
def __repr__(self): # 重写repr 便于阅读
return "<User(id=%s,username%s,password=%s,createtime=%s)>" % (
self.id,
self.username,
self.password,
self.creatime
)
from sqlalchemy.orm import relationship
from sqlalchemy import ForeignKey
\'\'\'创建表 user_details \'\'\'
class UserDetails(Base):
__tablename__=\'user_details\'
id = Column(Integer, primary_key=True, autoincrement=True)
id_card = Column(Integer,nullable=True,unique=True)
lost_login = Column(DateTime)
login_num = Column(Integer,default=0)
user_id = Column(Integer,ForeignKey(\'user.id\'))
\'\'\'
User 要关联的表的名字
backref 返回 details 方法(属性)
uselist 默认为True, 表示一对多关系(False表示一对一)
cascade 自动处理关系 相当于mysql中的ON DELETE 类似 有 7 个可选参数
在代码层控制
\'\'\'
userdetail = relationship(\'User\',backref=\'details\',uselist=False,cascade=\'all\')
def __repr__(self): # 重写repr 便于阅读
return \'<UserDetails(id=%s,id_card=%s,last_login=%s,login_num=%s,user_id=%s)>\'%(
self.id,
self.id_card,
self.lost_login,
self.login_num,
self.user_id
)
from sqlalchemy import Table
\'\'\' 创建表的另一种方法 这种方法没有映射,如果需要映射 还需重新创建 类,重写 repr\'\'\'
user_article = Table(\'user_article\',Base.metadata,
Column(\'user_id\',Integer,ForeignKey(\'user.id\'),primary_key=True),
Column(\'article_id\',Integer,ForeignKey(\'article.id\'),primary_key=True)
)
\'\'\'创建表 article \'\'\' class Article(Base): __tablename__ = \'article\' id = Column(Integer,primary_key=True,autoincrement=True) content = Column(String(50),nullable=True) create_time = Column(DateTime,default=datetime.now()) article_user = relationship(\'User\',backref=\'article\',secondary=user_article)# 创建映射关系 def __repr__(self): # 重写repr 便于阅读 return \'Article(id=%s,content=%s,create_time=%s)\'%( self.id, self.content, self.create_time ) if __name__ == \'__main__\': Base.metadata.create_all() # 执行
三 、 \'\'\'简单的 增、删、查、改 操作 \'\'\'
# -*- coding:utf-8 -*- from connect import session from user_module import User def add_user(): # 增 # persson = User(username=\'xiaohong\',password=\'qwe123\',id=1) # session.add(persson) # 提交单条数据 # 一次提交多条数据 , 注意 这里 all 里面是列表 session.add_all( [ User(username=\'小红\', password=\'qwe123mmm\'), User(username=\'老王\', password=\'12345nnnnn\'), User(username=\'小明\', password=\'654321hhhhh\'), ] ) session.commit() # 必须提交 def search_user(): # 查询 默认repr 便于机器阅读,需要重写 rows = session.query(User).all() print(rows) def update_user(): # 改 session.query(User).filter(User.id==2).update({User.password:1}) session.commit() def delete_user(): # 删除 # rows = session.query(User).filter(User.id==2)[0] rows = session.query(User).all() print(rows) for i in rows: # 如果查到的数据量大,就是用循环删除 session.delete(i) session.commit() if __name__ == \'__main__\': add_user() # search_user() # delete_user() # update_user()
推荐文章:廖雪峰的 使用SQLAlchemy
脚本之家的 Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
z+j 的 Python SqlAlchemy使用方法
K.Takanashi 的 SQLAlchemy的初步使用
以上是关于python ORM - sqlalchemy 操作使用的主要内容,如果未能解决你的问题,请参考以下文章
python flask orm sqlalchemy 实例