SQLAlchemy连接数据库
使用SQLALchemy去连接数据库,其实就是需要使用一些配置信息,然后将他们组合成满足条件的字符串:# dialect+driver://username:password@host:port/database
HOSTNAME = '' # 主机地址
PORT = '3306' # 端口号
DATABASE = '' # 数据库
USERNAME = '' # 数据库账号
PASSWORD = '' # 数据库密码
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)
# 判断是否连接成功
conn = engine.connect()
result = conn.execute('select 1')
print(result.fetchone())
将ORM模型映射到数据库中,即创建表
用
declarative_base
根据engine
创建一个ORM基类。from sqlalchemy.ext.declarative import declarative_base engine = create_engine(DB_URI) Base = declarative_base(engine)
用这个
Base
类作为基类来写自己的ORM类。要定义__tablename__
类属性,来指定这个模型映射到数据库中的表名。class User(Base): __tablename__ = 'user'
创建属性来映射到表中的字段,所有需要映射到表中的属性都应该为Column类型:
class User(Base): __tablename__ = 'user' # 2. 在这个ORM模型中创建一些属性,来跟表中的字段进行一一映射。这些属性必须是sqlalchemy给我们提供好的数据类型。 id = Column(Integer,primary_key=True,autoincrement=True) name = Column(String(50)) age = Column(Integer)
- 使用
Base.metadata.create_all()
来将模型映射到数据库中。 - 一旦使用
Base.metadata.create_all()
将模型映射到数据库中后,即使改变了模型的字段,也不会重新映射了。 - 可以使用
Base.metadata.drop_all()
将继承Base类的表从数据库中删除。
SQLAlchemy常用数据类型
- Integer:整形,映射到数据库中是int类型。
- Float:浮点类型,映射到数据库中是float类型。他占据的32位。
- Double:双精度浮点类型,映射到数据库中是double类型,占据64位。
- String:可变字符类型,映射到数据库中是varchar类型.
- Boolean:布尔类型,映射到数据库中的是tinyint类型。
- DECIMAL:定点类型。是专门为了解决浮点类型精度丢失的问题的。在存储钱相关的字段的时候建议大家都使用这个数据类型。并且这个类型使用的时候需要传递两个参数,第一个参数是用来标记这个字段总能能存储多少个数字,第二个参数表示小数点后有多少位。
Enum:枚举类型。指定某个字段只能是枚举中指定的几个值,不能为其他值。在ORM模型中,使用Enum来作为枚举,示例代码如下:
class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) tag = Column(Enum("python",'flask','django'))
在Python3中,已经内置了enum这个枚举的模块,我们也可以使用这个模块去定义相关的字段。示例代码如下:
class TagEnum(enum.Enum): python = "python" flask = "flask" django = "django" class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) tag = Column(Enum(TagEnum)) article = Article(tag=TagEnum.flask)
Date:存储时间,只能存储年月日。映射到数据库中是date类型。在Python代码中,可以使用
datetime.date
来指定。示例代码如下:class Article(Base): __tablename__ = 'article' id = Column(Integer,primary_key=True,autoincrement=True) create_time = Column(Date) article = Article(create_time=date(2017,10,10))
DateTime:存储时间,可以存储年月日时分秒毫秒等。映射到数据库中也是datetime类型。在Python代码中,可以使用
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))
Time:存储时间,可以存储时分秒。映射到数据库中也是time类型。在Python代码中,可以使用
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))
- Text:存储长字符串。一般可以存储6W多个字符。如果超出了这个范围,可以使用LONGTEXT类型。映射到数据库中就是text类型。
- LONGTEXT:长文本类型,映射到数据库中是longtext类型。只能用于Mysql数据库。
Column常用参数
primary_key
:设置某个字段为主键。autoincrement
:设置这个字段为自动增长的。default
:设置某个字段的默认值。在发表时间这些字段上面经常用。nullable
:指定某个字段是否为空。默认值是True,就是可以为空。unique
:指定某个字段的值是否唯一。默认是False。onupdate
:在数据更新的时候会调用这个参数指定的值或者函数。在第一次插入这条数据的时候,不会用onupdate的值,只会使用default的值。常用的就是update_time
(每次更新数据的时候都要更新的值)。name
:指定ORM模型中某个属性映射到表中的字段名。如果不指定,那么会使用这个属性的名字来作为字段名。如果指定了,就会使用指定的这个值作为参数。这个参数也可以当作位置参数,在第1个参数来指定。comment
:在数据库中的注释。