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 = '' # 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的初步使用 

     SQLAlchemy入门(一)

python ORM - sqlalchemy 操作使用的更多相关文章

  1. 【tips】ORM - SQLAlchemy操作MySQL数据库

    优先(官方文档SQLAlchemy-version1.2): sqlalchemy | 作者:斯芬克斯 推荐一(长篇幅version1.2.0b3):python约会之ORM-sqlalchemy | ...

  2. 【python】-- SQLAlchemy操作MySQL

    ORM.SQLAchemy orm英文全称object relational mapping,就是对象映射关系程序,简单来说就是类似python这种面向对象的程序来说一切皆对象,但是使用的数据库却都是 ...

  3. Python 使用sqlalchemy操作MYSQL

    1. 安装sqlalchemy库 SQL操作引擎可能需要pymysql,故要安装如下两个程序 pip install sqlalchemy pip instal pymysql

  4. flask 操作mysql的两种方式-sqlalchemy操作

    flask 操作mysql的两种方式-sqlalchemy操作 二.ORM sqlalchemy操作 #coding=utf-8 # model.py from app import db class ...

  5. Django和SQLAlchemy,哪个Python ORM更好?

    ORM是什么? 在介绍Python下的两个ORM框架(Django和SQLAlchemy)的区别之前,我们首先要充分了解ORM框架的用途. ORM代表对象关系映射.ORM中的每个单词解释了他们在实际项 ...

  6. 基于Python的SQLAlchemy的操作

    安装 在Python使用SQLAlchemy的首要前提是安装相应的模块,当然作为python的优势,可以到python安装目录下的scripts下,同时按住shift+加上鼠标左键,从而在菜单中打开命 ...

  7. Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍

    1. 添加一个新对象 前面介绍了映射到实体表的映射类User,如果我们想将其持久化(Persist),那么就需要将这个由User类建立的对象实例添加到我们先前创建的Session会话实例中: 复制代码 ...

  8. tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作

    tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作 一. ORM #在服务器后台,数据是要储存在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办?是不 ...

  9. python/ORM操作详解

    一.python/ORM操作详解 ===================增==================== models.UserInfo.objects.create(title='alex ...

随机推荐

  1. Contest 3

    A:非常裸的dp. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstrin ...

  2. Class类是什么? Class.forName()是干什么的?

    Class类概念 Class类用来描述一个类的结构,比如描述一个类有哪些成员,有哪些方法等.有多种方法可以获取一个类对应的Class类实例,比如: //第一种方式获取描述Dog类结构的Class类实例 ...

  3. 【BZOJ4004】装备购买(线性基)

    [BZOJ4004]装备购买(线性基) 题面 BZOJ 洛谷 Description 脸哥最近在玩一款神奇的游戏,这个游戏里有 n 件装备,每件装备有 m 个属性,用向量zi(aj ,.....,am ...

  4. Sort Integers II

    Given an integer array, sort it in ascending order. Use quick sort, merge sort, heap sort or any O(n ...

  5. 洛谷 P2053 [SCOI2007]修车 解题报告

    P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...

  6. 程序开发常用第三方类库一览表(VendorLib)

    以下是自己开发过程中用到的第三方类库,记录下来方便查阅 ------------------------------------------------------------------------ ...

  7. linux 进程信号集合 sigset_t

    sigset_t 号集及信号集操作函数:信号集被定义为一种数据类型: typedef struct { unsigned long sig[_NSIG_WORDS]: } sigset_t 信号集用来 ...

  8. 《剑指offer》— JavaScript(12)数值的整数次方

    数值的整数次方 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 思路一 考察指数的正负以及底数是否为零的几种情形: 将指数转换 ...

  9. Topcoder SRM570 D1L3 CurvyonRails

    几个样例: 5 5wCCwwwCC....w......www..wReturns: 0 3 3C.w....C.Returns: 1 21 20CC..CCCw.CwC..CC.w.CC.CCCwC ...

  10. bzoj4715 囚人的旋律

    4715: 囚人的旋律 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 74  Solved: 48[Submit][Status][Discuss] ...