# encoding: utf-8
from sqlalchemy import create_engine,Column,Integer,String,Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
HOSTNAME = "127.0.0.1"
PORT = "3306"
DATABASE = "first_sqlalchemy"
USERNAME = "root"
PASSWORD = "jiaojiao"
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".\
format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
engine = create_engine(DB_URI)
Base = declarative_base(engine)
session = sessionmaker(engine)()
class Article(Base):
__tablename__ = "article"
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50))
content = Column(Text)
def __str__(self):
return "" %(self.title,self.content)
# 首先先写好连接数据库的的代码,然后再对数据库进行增删改查,
# 事实上如果你对java操作数据库有些了解的话你会发现通过orm来对数据进行增啥改查非常类似,废话不多说直接上代码:
# 添加数据
def add_data():
article1 = Article(title="jiaojiao1",content="content1")
article2 = Article(title="jiaojiao2",content="content2")
article3 = Article(title="jiaojiao3",content="content3")
session.add_all([article1,article2])
session.commit()
session.add(article3)
session.commit()
orm添加数据有两种方式,一种是一条一条逐个添加,还有一种是直接传数组添加
看完orm添加数据的方式,那么再来说说sql语句添加数据的写法吧
INSERT INTO article VALUES(NULL,"jiaojiao1","content1")
INSERT INTO article VALUES(NULL,"jiaojiao2","content2")
INSERT INTO article VALUES(NULL,"jiaojiao3","content3")
# 删除数据
def delete_data():
article = session.query(Article).filter_by(title="jiaojiao3").all()
for p in article:
session.delete(p)
session.commit()
DELETE FROM article WHERE title="jiaojiao3"
其实当我学会删除数据的时候我们就已经会一些简单的查询数据的方法了,因为删除数据必须要先查找到对应的数据才能进行操作
# 更改数据
def update_data():
article = session.query(Article).first()
article.title = "觉觉最帅"
session.commit()
UPDATE article SET title="觉觉最帅" WHERE id=1
def select_data():
# 查询所有数据
all_article = session.query(Article).all()
for p in all_article:
print(p)
# 条件查询数据
article1 = session.query(Article).filter_by(title="jiaojiao3").all()
for p1 in article1:
print(p1)
# 根据id查询数据
article2 = session.query(Article).get(2)
print(article2)
# filter查询数据
article3 = session.query(Article).filter(Article.title == "jiaojiao2").all()
for p3 in article3:
print(p3)
首先先看第一种查询全部数据,先将all()这个方法去掉,打印all_article这个变量
all_article = session.query(Article)
print(all_article)
从控制台上就会打印出
SELECT article.id AS article_id, article.title AS article_title, article.content AS article_content FROM article
这里article.title AS article_title和article.content AS article_content是将这个title和content这两个变量定义一个新的别名article_title和article_content这两个别名。我们对比一下查询语句的语法
SELECT (需要查询的列) from (表名)
对比一下就能理解很多,其实这个语句可以用一种比较简单的写法SELECT * FROM article
在sql语句中*代表的就是查询全部所以这里用*会方便很多
接下来再看看其他两种条件查询
article1 = session.query(Article).filter_by(title="jiaojiao2")
print(article1)
SELECT article.id AS article_id, article.title AS article_title, article.content AS article_content
FROM article WHERE article.title = %(title_1)s
这里%(title_1)s条件没有转换过来其实是和title=“jiaojiao2”是一样的
查询数据有两种方法,一种是filter_by(),一种是filter(),这两种方法并没有谁好谁坏
1.filter_by()直接写属性名(表中的column名)=我们要查找的数据,这样便能直接寻找到我们需要的所有数据,使用起来比较方便
2.filter()方法略微复杂一些,需要model名对应的属性和我们进行查找的数据进行对比,相同的便能被找到,这种方法虽然比较麻烦,但是能做更多复杂的查询操作。