Sqlalchemy实战入门--建表

​ 现在所有的sqlalchemy入门教程都比较笼统,所以自己写一份教程。

安装

#安装mysql连接包
pip install pymysql
#安装sqlalchemy
pip install sqlalchemy 

创建orm模型

from sqlalchemy import Column
from sqlalchemy import DateTime
from sqlalchemy import INTEGER
from sqlalchemy import String
from sqlalchemy.sql import func
from sqlalchemy.ext.declarative import declarative_base

# 声明映像,映射基类,用来生成ORM映射
Base = declarative_base()

class User(Base):
    # 写明实际数据库中的映射表名,<必须有>
    __tablename__ = 'user_table'
    # 每个字段都需要使用Column来声明
    id = Column(INTEGER, primary_key=True, autoincrement=True)
    name = Column(name='username', type_=String(length=32), nullable=False)
    age = Column(INTEGER, default=20)
    insert_time = Column(DateTime, server_default=func.now())

解释其中字段名称:

  • Column:表示列字段名,其中需要传递参数如下:

    • name: 数据库表字段名称;

    • type_: 数据库类型,其中常用以下几个:

      • String --> varchar(),其中可以指定length大小,如:

        String(255) --> varchar(255)

      • Integer --> int(11) , 整型

      • Datetime --> datetime

      • TEXT ..等等

    • primary_key: 是否为主键;

    • autoincrement: True,为自增,在插入时不用赋值;

    • nullable: 是否可以为空

      • False: 不能为空
      • True: 为空
    • server_default: 数据库端的默认值:

      server_default=func.now() 也就是说 插入时,在数据库执行时使用 insert into (insert_time) values(now())

    • defalut : 在程序端给其赋值为 0

以上,我们的一张映射表创建成功;

使用sqlalchemy查看生成表语句

>>>from sqlalchemy.schema import CreateTable
>>>print(CreateTable(User.__table__))
CREATE TABLE user_table (
    id INTEGER NOT NULL, 
    username VARCHAR(32) NOT NULL, 
    age INTEGER, 
    insert_time DATETIME DEFAULT now(), 
    PRIMARY KEY (id)
)

​ sqlachemy.schema中存在很多对Model视图的操作,这里我们可以用其Createtable ,就可以看下当前表的创建语句了。

审查当前模型的参数

​ 在我们查询(之后讲)的时候,数据库返回的模型实例对象,那么,当我们在进行API编写的时候非常不方便,如:使用Flask的话,我们返回json字符串,那么我们需要将当前模型转化成dict,然后调用jsonify,这样很不方便,这里便提供两种方式:

使用sqlchemy的inspect

from sqlalchemy import inspect 
insp = inspect(User)
print(insp.all_orm_descriptors.keys())
#输出:
#['id', 'insert_time', '__mapper__', 'name', 'age']

提供一个to_dict函数

def to_dict(cls):
    obj_dict = {}
    if not isinstance(cls, Base):
        print('false')
        return obj_dict
    insp = inspect(User)
    for item in insp.all_orm_descriptors.keys():
        if item != '__mapper__':
            obj_dict[item] = getattr(cls, item)
    return obj_dict
        
user = User(name='aaaa', age=12)
print(to_dict(user))
# 输出
# {'id': None, 'insert_time': None, 'name': 'aaaa', 'age': 12}

提供一个DictMixin

class DictMixin(object):

    def _set_object(self, data):
        if not isinstance(data, dict):
            return None
        for c in self.__table__.columns:
            setattr(self, c, data.get(c))

    def to_dict(self):
        return {c.name: getattr(self, c.name, None)
                for c in self.__table__.columns}

创建所有表

数据库建立连接

​ 使用sqlalchemy连接数据库,我们可以通过需要以下几步:

from sqlalchemy.engine import create_engine
from sqlalchemy.orm import sessionmaker

# 第一步创建连接引擎
engine = create_engine(f'mysql+pymysql://{root}:{password}@{host}:{port}/{database}')
# 第二步创建session工厂函数
sess = sessionmaker(engine)
# 第三步创建本地session进行使用
session = sess()

使用engine进行原始sql的执行

第一种:直接使用sql语句

conn = engine.connect()
rs = conn.execute('select 1')
data = rs.fetchone()[0]
print(data)

第二种:配合text查询

from sqlalchemy import text
t = text('select * from test0 where t_id=:t_id')
result = conn.execute(t, t_id='aaaaa')
data = result.fetchone()
print(data)

注意

sqlalchemy的数据库池的管理

​ 默认创建create_engine的时候,其以下几个是默认值管理数据库连接池:

  • max_overflow = 10, 连接池的上限,最大超过pool_size多少个;
  • pool_size = 5, 数据库连接池的大小;

所以数据库连接池最大连接数等于: 15

  • pool_timeout = 30, 池中没有线程最多等待的时间,否则报错;
  • pool_recycle=-1, 多长时间对进程池中的线程回收一次;

以上。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,385评论 1 14
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,256评论 0 9
  • Flask-SQLAlchemy的使用: ORM的好处:可以让我们操作数据库跟操作对象是一样的,非常方便,因为一个...
    Dozing阅读 23,251评论 3 23
  • SQLAlchemy学习笔记(一) 为什么要使用SQLAlchemy? 将你的代码抽象出来不依赖与数据库的类型和某...
    麦卡鲁阅读 3,067评论 0 1
  • 送完女儿去学习跳拉丁舞后,雪影终于可以拥有一个人独处的时候。尽管只有短短的俩个小时,可是对雪影来说,这是无比珍贵的...
    A镜中人阅读 380评论 0 5