见当前目录下的MySQL安装详解.doc
MySQL Workbench是一款专为MySQL设计的ER/数据库建模工具。它是著名的数据库设计工具DBDesigner4的继任者。你可以用MySQL Workbench设计和创建新的数据库图示,建立数据库文档,以及进行复杂的MySQL 迁移。
具体使用可以参考:https://blog.csdn.net/soulandswear/article/details/60966808
在Python3中直接安装pymysql
, Python2中使用MySQLdb
使用SQLALchemy去连接数据库,需要使用一些配置信息,然后将他们组合成满足条件的字符串:
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'test'
USERNAME = 'root'
PASSWORD = 'root'
# dialect+driver://username:password@host:port/database
DB_URI = "mysql+pymysql://{username}:{password}@{host}:{port}/{db}?charset=utf8".format(username=USERNAME,password=PASSWORD,host=HOSTNAME,port=PORT,db=DATABASE)
然后使用create_engine
创建一个引擎engine
,然后再调用这个引擎的connect
方法,就可以得到这个对象,然后就可以通过这个对象对数据库进行操作了:
engine = create_engine(DB_URI)
with engine.connect() as con:
rs = con.execute("SELECT 1")
print(rs.fetchone())
ORM是对象关系映射,也就是对象模型与数据库表之间的映射
declarative_base
根据engine
创建一个ORM基类。
Base
类作为基类来写自己的ORM类。要定义__tablename__
类属性,来指定这个模型映射到数据库中的表名。
Base.metadata.create_all()
来将模型映射到数据库中。
Base.metadata.create_all()
将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。
如果你想要让他重新映射,在前面加Base.metadata.drop_all()
或者使用后面的alembic
或flask-migrate。
在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须是sqlalchemy给我们提供好的数据类型。
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
DB_URI = "mysql+pymysql://root:123456@127.0.0.1:3306/test?charset=utf8"
engine = create_engine(DB_URI)
# 这个函数返回元类(MetaClass)
Base = declarative_base(engine)
class Person(Base):
__tablename__ = 'person'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(50))
age = Column(Integer)
Base.metadata.create_all()
session
的会话对象来实现,通过以下代码来获取会话对象: from sqlalchemy.orm import sessionmaker engine = create_engine(DB_URI) session = sessionmaker(engine)()
注意session = sessionmaker(engine)()
后面还有一对括号
python
p = Person(name='ying',age=18,country='china')
session
会话对象中:
python
session.add(p)
python
session.commit()
python
p1 = Person(name='ying1',age=19,country='china')
p2 = Person(name='ying2',age=20,country='usa')
session.add_all([p1,p2])
session.commit()
session.delete
方法将这条数据从session中删除,最后做commit操作就可以了。 person = session.query(Person).first() session.delete(person) session.commit()
Column(DECIMAL(10, 4))
,如果插入数据的时候数据不在改范围内,报错。
datetime.date
来指定。示例代码如下: class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) create_time = Column(Date) article = Article(create_time=date(2018,10,10))
datetime.datetime
来指定。示例代码如下: class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) create_time = Column(DateTime) article = Article(create_time=datetime(2011,11,11,11,11,11))
datetime.time
来至此那个。示例代码如下: class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) create_time = Column(Time) article = Article(create_time=time(hour=11,minute=11,second=11))
python
title = Column(String(50),name='title',nullable=False)
title = Column('my_title',String(50),nullable=False)
query
函数的参数func.count
:统计行的数量。 session.query(func.count(Article.price)).first()
func.avg
:求平均值。 session.query(func.avg(Article.price)).first()
func.max
:求最大值。
func.min
:求最小值。
func.sum
:求和。
func
上,其实没有任何聚合函数。但是因为他底层做了一些魔术,只要mysql中有的聚合函数,都可以通过func
调用。
__repr__
函数可以自定义类的返回def __repr__(self):
return 'Title: %s' % self.title
返回: Title: xxx
过滤是数据提取的一个很重要的功能,以下对一些常用的过滤条件进行解释,并且这些过滤条件都是只能通过filter方法实现的:
python
article = session.query(Article).filter(Article.title == "title0").first()
print(article)
python
query.filter(User.name != 'ed')
如果想要查看ORM
底层转换的SQL
语句,可以在filter方法后面不要再执行任何方法直接打印就可以看到了。比如:
articles = session.query(Article).filter(or_(Article.title=='abc',
Article.content=='abc'))
print(articles)
filter
即可,不需要在后面加first()
或all()
使用SQLAlchemy创建外键非常简单。在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了。从表中外键的字段,必须和父表的主键字段类型保持一致。 示例:
class User(Base):
__tablename__ = 'user'
id = Column(Integer,primary_key=True,autoincrement=True)
username = Column(String(50),nullable=False)
class Article(Base):
__tablename__ = 'article'
id = Column(Integer,primary_key=True,autoincrement=True)
title = Column(String(50),nullable=False)
content = Column(Text,nullable=False)
uid = Column(Integer,ForeignKey("user.id"))
外键约束有以下几项: 1. RESTRICT:父表数据被删除,会阻止删除。默认就是这一项。 2. NO ACTION:在MySQL中,同RESTRICT。 3. CASCADE:级联删除。 父删子删 4. SET NULL:父表数据被删除,子表数据会设置为NULL。注意:字段属性不能有nullable=False
id = Column(Integer, ForeignKey("user.id", ondelete="RESTRICT"))
InnoDB