zoukankan      html  css  js  c++  java
  • python开发部署时新增数据库中表的方法

    在项目版本让运维部署时,涉及到数据库表的增加问题,想了一下,可以有四种方法

    1.使用SQLAlchemy的db.create_all()方法

    # -*- coding:utf-8 -*-
    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from sqlalchemy.sql import text
    
    HOST = '127.0.0.1'
    USER = "root"
    PASSWD = ""
    DB = "carrier_test"
    CHARTSET = "utf8"
    
    app = Flask(__name__,instance_relative_config = True)
    #链接数据库路径
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://%s:%s@127.0.0.1:3306/%s?charset=%s' %(USER,PASSWD,DB,CHARTSET)
    #如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    #如果设置成 True,SQLAlchemy 将会记录所有 发到标准输出(stderr)的语句,这对调试很有帮助。
    app.config['SQLALCHEMY_ECHO'] = False
    # 数据库连接池的大小。默认是数据库引擎的默认值 (通常是 5)。
    app.config['SQLALCHEMY_POOL_SIZE'] = 6
    db = SQLAlchemy(app)
    
    class Table_one(db.Model):
        __tablename__ = 'table_one'
    
        id = db.Column('id', db.Integer, primary_key=True, autoincrement=True)
        com_name = db.Column('com_name', db.String(30), nullable=False)
        com_about = db.Column('com_about', db.String(200), nullable=False)
    
        def __repr__(self):
            return '<table_one com_name %r>' % self.com_name
    if __name__=='__main__':#创建表
        db.create_all()

    如果在windows执行过程中报错  ModuleNotFoundError: No module named 'MySQLdb'     ,安装    pip install mysqlclient   解决问题。

    相关网址: https://www.cnblogs.com/guohaojintian/p/6030818.html

    2.使用MySQLdb进行新增表

    import MySQLdb
    
    HOST = '127.0.0.1'
    USER = "root"
    PASSWD = ""
    DB = "carrier"
    CHARTSET = "utf8"
    
    db=MySQLdb.connect(HOST,USER,PASSWD,DB)
    cursor=db.cursor()
    
    if __name__ == '__main__':
    
        if cursor:
            command_a = """CREATE TABLE `tea2` (
                          `id` int(11) NOT NULL AUTO_INCREMENT,
                          `name` varchar(128) DEFAULT NULL,
                          `na_medf` varchar(128) DEFAULT NULL,
                          PRIMARY KEY (`id`)
                        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;"""
            cursor.execute(command_a)
            db.commit()
            db.close()

     3.使用Flask-Migrate扩展迁移数据库

    安装相关插件
    $ pip install Flask-Migrate

    文件名:migrate_create_table.py

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from flask_script import Manager
    from flask_migrate import Migrate, MigrateCommand
    
    #初始化app
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:@127.0.0.1:3306/carrier?charset=utf8'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    
    db = SQLAlchemy(app)
    #初始化migrate相关
    migrate = Migrate(app, db)
    manager = Manager(app)
    manager.add_command('db', MigrateCommand)
    
    
    class Tea(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(128))
        na_medf = db.Column(db.String(128))
    
    
    if __name__ == '__main__':
        manager.run()

    代码写好之后,运行此文件,配合相关命令进行数据库更新

    first:通过init命令来创建一个迁移库,执行后会在文件同级目录创建一个migrations文件夹,里面存放了所有迁移脚本。

    注意点: 如果需要重新执行此命令,需要删除migrations文件夹,否则报文件夹已经存在错误   alembic.util.exc.CommandError: Directory migrations already exists

    python migrate_create_table.py db init

    secound:通过migrate命令创建自动迁移脚本,此时会在数据库增加一张表(alembic_version),记录migrate更新的版本号

    python migrate_create_table.py db migrate

    third:通过 upgrade命令更新到数据库中

    python migrate_create_table.py db upgrade

    这时候打开数据库,便可看到新增的表,以及alembic_version表中新增的版本号

     注意点:1.在以后数据库迁移更新中,不再需要初始化,所以跳过init命令

                   2.以上命令是在linux命令窗口中,在pycharm代码编辑软件中为

                           I.点击 Edit Configurations   

                         II.输入 db  **** 等命令   

     4.直接使用sql语句

     类似于第二种,区别在于运维部署多了一个步骤

    此四种方法,推荐使用第二种进行新增表,第三种更利于数据库结构的回滚(使用 downgrade命令)。

  • 相关阅读:
    机器人
    昨天拿钥匙了
    Linux挂NTFS格式USB硬盘
    漫游在首都
    RHEL+WAS6部署风波
    移动电话国内漫游通话费上限评估用户意见网上调查
    WebSphere fixes
    我太强悍了
    NO SUBJECT
    pku3617 Best Cow Line
  • 原文地址:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_383days.html
Copyright © 2011-2022 走看看