精华内容
下载资源
问答
  • Python执行sql文件

    2020-11-30 13:47:25
    使用Python执行sql文件 # coding: utf-8 import pymysql try: db = pymysql.connect("服务器地址", "用户名", "密码", "数据库名称") c = db.cursor() with open('test.sql',mode='r') as f: # 读取整个sql文件...

    使用Python执行sql文件

    直接上代码,粘贴下来配置相应参数后直接使用,喜欢的可以关注博主!!

    # coding: utf-8
    import pymysql
    import warnings
    import pandas as pd
    from sqlalchemy import create_engine
    warnings.filterwarnings('ignore')
    
    
    DB_USERNAME = ''
    DB_PASSWORD = ''
    DB_HOST = ''
    DB_PORT = '3306'
    DB_NAME = 'information_schema'
    DB_URI = 'mysql+pymysql://%s:%s@%s:%s/%s?charset=utf8mb4' % (
        DB_USERNAME, DB_PASSWORD, DB_HOST, DB_PORT, DB_NAME)  # ?charset=utf8mb4
    engine = create_engine(DB_URI, encoding='utf8', echo=False)
    conn = engine.connect()
    
    
    def execute_main(database,filepath):
        try:
            db = pymysql.connect("183.84.12.75", "", "", database)
            c = db.cursor()
            with open(filepath,mode='r') as f:
                # 读取整个sql文件,以分号切割。[:-1]删除最后一个元素,也就是空字符串
                sql_list = f.read().split(';')[:-1]
    
                for x in sql_list:
                    line=x.split('\n')
                    L=''
                    for y in line:
                        l=y.split('#',1)[0].split('-- ',1)[0]
                        L=L+' '+l
    
                    # sql语句添加分号结尾
                    sql_item = L+';'
                    # print(sql_item)
                    c.execute(sql_item)
                    print("执行成功sql: %s"%sql_item)
        except Exception as e:
            print(e)
            print('执行失败sql: %s'%sql_item)
        finally:
            # 关闭mysql连接
            c.close()
            db.commit()
            db.close()
    
    
    res = list(conn.execute('''select routine_name ,routine_schema ,routine_definition from `routines` ;'''))
    
    # for x in res:
        # sql_res = x[2][5:][:-3]
        # filepath = r'C:\Users\admin\Desktop\自动化\sql文件'+'\\'+x[0]+'.sql'
        # with open(filepath,'w') as w:
        #     w.write(sql_res)
    
        # execute_main(x[1],filepath)
    
    filepath = r'C:\Users\admin\Desktop\自动化\sql文件'+'\\'+'db_pd_店铺_销售日报'+'.sql'
    execute_main('hdbi_database',filepath)
    
    展开全文
  • python执行sql文件

    万次阅读 2017-09-19 16:25:39
    最近遇到一对需要执行sql文件sql文件内是insert 语句。如下:INSERT INTO hs_his.stock_industry VALUES ('采掘', '000006', '深振业A'); INSERT INTO hs_his.stock_industry VALUES ('采掘', '000409', '山东...

    最近遇到一对需要执行的sql文件,sql文件内是insert 语句。如下:

    INSERT INTO hs_his.stock_industry VALUES ('采掘', '000006', '深振业A');
    INSERT INTO hs_his.stock_industry VALUES ('采掘', '000409', '山东地矿');
    INSERT INTO hs_his.stock_industry VALUES ('采掘', '000552', '靖远煤电');
    INSERT INTO hs_his.stock_industry VALUES ('采掘', '000571', '新大洲A');
    INSERT INTO hs_his.stock_industry VALUES ('采掘', '000629', '*ST钒钛');
    INSERT INTO hs_his.stock_industry VALUES ('采掘', '000655', '金岭矿业');

    本来需要插入的表并不多,仅七八张,手动执行下也很快。但是实施人员给过来的sql文件,一张表的数据根据数据量硬生生生成了近10个文件。文件多了,若手动执行,很容易出现遗漏或者重复操作,造成错误。
    由于文件内结构比较单一,故用脚本实现。代码如下:

    
    def execute_sql(conn, cur, path=r"D:\个人"):
        """执行指定目录下的.sql文件"""
        os.chdir(path)
        for each in os.listdir("."):
            count = 0   #读取行数
            sql = ""    #拼接的sql语句
            if "hisdatastock_replace.sql" in each:
                with open(each, "r", encoding="utf-8") as f:
                    for each_line in f.readlines():
                        # 过滤数据
                        if not each_line or each_line == "\n":
                            continue
                        # 读取2000行数据,拼接成sql
                        elif count < 2000:
                            sql += each_line
                            count += 1
                        # 读取达到2000行数据,进行提交,同时,初始化sql,count值
                        else:
                            cur.execute(sql)
                            conn.commit()
                            sql = each_line
                            count = 1
                    # 当读取完毕文件,不到2000行时,也需对拼接的sql 执行、提交
                    if sql:
                        cur.execute(sql)
                        conn.commit()

    以上execute_sql函数,会默认执行入参path路径下,所有文件名包含“.sql”文件。
    如下,写一个连接配置数据的类。

    class Connect_mysql:
        """Get Configuration and Connect to Mysql!"""
        def __init__(self):
            setup_logging()
        def get_config(self,file_name="config"):
            """Get Configuration!"""
            with open(file_name, "r", encoding="utf-8") as f:
                config = json.load(f)
            return config
    
        def conn_mysql(self, host, port, user, password, database, charset="utf8"):
            """Connetct to Mysql."""
            logger = logging.getLogger(self.__class__.__name__)
            try:
                conn = pymysql.connect(host=host, port=port, user=user, password=password,  database=database, charset=charset)
                cur = conn.cursor()
                return conn, cur
            except Exception as e:
                logger.info('Connect to mysql Error!')
                logger.error(e)

    get_config函数是获取数据库配置。文件”config“数据库配置如下:

    {
        "dev":{
            "host":"aaa",
            "port":3306,
            "user":"aaa",
            "password":"aaa",
            "database":"aaa",
            "charset":"utf8"
            },
        "localhost":{
            "host":"localhost",
            "port":3306,
            "user":"root",
            "password":"123456",
            "database":"ifs_test1",
            "charset":"utf8"
            },
        "sit":{
            "host":"ccc",
            "port":3306,
            "user":"ccc",
            "password":"ccc",
            "database":"ccc",
            "charset":"utf8"
            }
    }

    运行代码:

    conn_sql = Connect_mysql()
    config = conn_sql.get_config()  # get configuration
    # Connect to mysql,若需切换数据库,只要替换“dev”为所需数据库即可
    conn, cur = conn_sql.conn_mysql(config["dev"]["host"], config["dev"]["port"], config["dev"]["user"],
                                    config["dev"]["password"], config["dev"]["database"], config["dev"]["charset"])
    展开全文
  • 几乎所有的Python教程都会讲,教程里基本只介绍了执行单条SQL语句的方法,但是实际生产过程中可不只是执行一两条语句,动辄几十条甚至上百条的SQL语句,一个.SQL的SQL文件正常都会包含多条SQL语句,如果把这些SQL...

    一、简介

    关于Python如何连接数据库并执行SQL语句,几乎所有的Python教程都会讲,教程里基本只介绍了执行单条SQL语句的方法,但是实际生产过程中可不只是执行一两条语句,动辄几十条甚至上百条的SQL语句,一个.SQL的SQL文件正常都会包含多条SQL语句,如果把这些SQL语句直接贴进Python代码文件,势必会影响代码的可读性和美感,代码量也冗余,那么Python能不能像oracle的PL/SQL客户端或者navicat一样读取SQL文件并且执行会是一件非常有趣的事情。

    经过不断百度和尝试,一段优雅的Python代码终于敲出来,作为开源的忠实粉丝,技术始于分享,现将Python执行SQL文件的代码分享在CSDN,代码实例是MySQL数据库。

    二、原理实现

    我们知道,mysql的语句执行时,默认是以分号结尾的。因此,只要将整个sql文件读取,以分号切割,就可以得到sql语句。

    sql文件,内容如下:

    USE test;/*迁移用户信息*/INSERT INTO `users` (

    `UID`,

    `USERNAME`,

    `PASSWORD`,

    `ROLE`,

    `CREATE_TIME`

    ) SELECT

    `id`,

    `username`,

    `password`,

    `level`,

    `create_time`

    FROM

    tbl_users;

    使用python切割以分号切割,打印的sql还是很多行。因此需要将换行符,替换为空格。末尾增加分号结尾

    with open('test.sql',encoding='utf-8',mode='r') as f:

    # 读取整个sql文件,以分号切割。[:-1]删除最后一个元素,也就是空字符串

    sql_list= f.read().split(';')[:-1]for x insql_list:

    # 判断包含空行的if '\n' inx:

    # 替换空行为1个空格

    x= x.replace('\n', ' ')

    # sql语句添加分号结尾

    sql_item= x+';'print(sql_item)

    执行输出:

    USE test;/*迁移用户信息*/ INSERT INTO `users` ( `UID`, `USERNAME`, `PASSWORD`, `ROLE`, `CREATE_TIME` ) SELECT `id`, `username`, `password`, `level`, `create_time` FROM tbl_users;

    可以发现,会有很多空行。可以再加一个判断,进行替换

    with open('test.sql',encoding='utf-8',mode='r') as f:#读取整个sql文件,以分号切割。[:-1]删除最后一个元素,也就是空字符串

    sql_list = f.read().split(';')[:-1]for x insql_list:#判断包含空行的

    if '\n' inx:#替换空行为1个空格

    x = x.replace('\n', ' ')#判断多个空格时

    if ' ' inx:#替换为空

    x = x.replace(' ', '')#sql语句添加分号结尾

    sql_item = x+';'

    print(sql_item)

    执行输出:

    USE test;/*迁移用户信息*/ INSERT INTO `users` ( `UID`, `USERNAME`, `PASSWORD`, `ROLE`, `CREATE_TIME` ) SELECT `id`, `username`, `password`, `level`, `create_time` FROM tbl_users;

    三、正式代码

    上面的步骤已经得到完整的sql语句了,那么就可以使用pymysql模块来执行每一句sql了。

    环境说明

    原始表结构为:

    CREATE TABLE `tbl_users` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `username` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',

    `password` char(32) NOT NULL DEFAULT '' COMMENT '密码',

    `level` tinyint(10) NOT NULL DEFAULT '2' COMMENT '用户等级',

    `create_time` datetime DEFAULT NULL COMMENT'创建时间',

    PRIMARY KEY (`id`)

    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户表';

    目标表结构为:

    CREATE TABLE `users` (

    `UID` bigint(20) NOT NULL AUTO_INCREMENT,

    `USERNAME` varchar(20) NOT NULL DEFAULT '' COMMENT '用户名',

    `PASSWORD` char(32) NOT NULL DEFAULT '' COMMENT '密码',

    `ROLE` varchar(20) NOT NULL DEFAULT '' COMMENT '角色',

    `CREATE_TIME` datetime DEFAULT NULL COMMENT'创建时间',

    PRIMARY KEY (`UID`)

    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户表';

    需要将原始表的数据,迁移到目标表中。

    mysql服务器ip为 192.168.10.104,用户名和密码都是root,使用test数据库。

    完整代码

    完整代码如下:

    #!/usr/bin/env python3#coding: utf-8

    importpymysqltry:

    db= pymysql.connect("192.168.10.104", "root", "root", "test")

    c=db.cursor()

    with open('test.sql',encoding='utf-8',mode='r') as f:#读取整个sql文件,以分号切割。[:-1]删除最后一个元素,也就是空字符串

    sql_list = f.read().split(';')[:-1]for x insql_list:#判断包含空行的

    if '\n' inx:#替换空行为1个空格

    x = x.replace('\n', ' ')#判断多个空格时

    if ' ' inx:#替换为空

    x = x.replace(' ', '')#sql语句添加分号结尾

    sql_item = x+';'

    #print(sql_item)

    c.execute(sql_item)print("执行成功sql: %s"%sql_item)exceptException as e:print(e)print('执行失败sql: %s'%sql_item)finally:#关闭mysql连接

    c.close()

    db.commit()

    db.close()

    执行输出:

    执行成功sql: USE test;

    执行成功sql:/*迁移用户信息*/ INSERT INTO `users` ( `UID`, `USERNAME`, `PASSWORD`, `ROLE`, `CREATE_TIME` ) SELECT `id`, `username`, `password`, `level`, `create_time` FROM tbl_users;

    本文参考链接:

    展开全文
  • Python读取sql文件,且可执行

    万次阅读 2019-05-17 17:44:43
    python 直接读取 sql 文件,达到使用 read_sql执行的目的

     

    python 直接读取 sql 文件,达到使用 read_sql 可执行的目的

    
    # sql文件夹路径
    sql_path = 'sql文件夹路径' + '\\'
    
    # sql文件名, .sql后缀的
    sql_file = 'sql文件名.sql'
    
    # 读取 sql 文件文本内容
    sql = open(sql_path + sql_file, 'r', encoding = 'utf8')
    sqltxt = sql.readlines()
    # 此时 sqltxt 为 list 类型
    
    # 读取之后关闭文件
    sql.close()
    
    # list 转 str
    sql = "".join(sqltxt)
    
    import pandas as pd
    import pymysql
    con = pymysql.connect(host = "机器", 
                          user = "用户名", password = '密码', 
                          db = "数据库名", charset='utf8')
    # charset用于修正中文输出为问号的问题
    
    df = pd.read_sql(sql, con)
    con.close()
    
    #  con为数据库连接设置,参考以下链接
    #  https://blog.csdn.net/zyq_victory/article/details/78153404
    
    # 结果就是将自己写的 sql 提取的数据读取为 DataFrame
    
    

     

    展开全文
  • python读取sql的方法:1、利用python内置的open函数读入sql文件;2、利用第三方库pymysql中的connect函数连接mysql服务器;3、利用第三方库pandas中的read_sql方法读取传入的sql文件即可。python 直接读取 sql ...
  • 我正在尝试创建一个多脚本工具,该工具将使用.sql文件的参数并执行它.我已经建立了一个简单的测试,只在一个数据库上执行,但是语法每次都会给我带来麻烦.DELIMITER $$CREATE DEFINER=`a_user`@`%` PROCEDURE `a_...
  • 20行Python代码执行SQL文件

    万次阅读 2018-03-20 22:41:04
    几乎所有的Python教程都会讲,教程里基本只介绍了执行单条SQL语句的方法,但是实际生产过程中可不只是执行一两条语句,动辄几十条甚至上百条的SQL语句,一个.SQL的SQL文件正常都会包含多条SQL语句,如果把这些SQL...
  • 在windows上用python如何执行sql文件或者sql语句(不存在db api情况下) 求大神指点 或者是windows上如何可以跳转到db2上执行命令 sql 语句如下: db2 connect to schema user userid password password load ...
  • python代码执行SQL文件(逐句执行)

    千次阅读 2019-09-08 17:16:00
    几乎所有的Python教程都会讲,教程里基本只介绍了执行单条SQL语句的方法,但是实际生产过程中可不只是执行一两条语句,动辄几十条甚至上百条的SQL语句,一个.SQL的SQL文件正常都会包含多条SQL语句,如果把这些SQL...
  • python 批量执行sql文件

    2014-05-05 17:03:42
    然后用python 写了这样一个文件文件存放位置: /root/sql/ 文件名:2 3 4 5 6 .....这样做是为了省事 用 range(2,24)其实可以写成读取目录文件:os.listdir("/root/sql/")######## author shenym ###...
  • 问题:如果SQL脚本文本之间没有换行符,如下 这里直接使用 with open命令获得SQL文本,然后使用pandas的read_sql_query函数向数据库直接拉去数据即可。 但问题是一般我们写SQL并不会直接在文本文档中写,在...
  • 原标题:Python学习教程:使用Python批量修改数据库执行Sql文件这篇Python学习教程你那个学会了加以转化也是一个技能哦,如何批量修改数据库执行Sql文件有时候咱们批量修改了文件,有的数据库也需要批量修改一下,...
  • 主要给大家介绍了关于利用Python如何批量修改数据库执行Sql文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • python执行sql脚本工具

    2018-04-28 10:16:27
    python中连接mysql数据库,可作为远程服务器无权限访问mysql工具类使用
  • python读取sql的方法:1、利用python内置的open函数读入sql文件;2、利用第三方库pymysql中的connect函数连接mysql服务器;3、利用第三方库pandas中的read_sql方法读取传入的sql文件即可。python 直接读取 sql ...
  • python读取sql文件,批量操作数据库

    千次阅读 2019-12-01 16:19:04
    executeScriptsFromFile('D:\test\Desktop\SQL.sql',cur)#文件路径 # 涉及写操作注意要提交 conn.commit() # 关闭游标 cur.close() # 关闭连接 conn.close() 代码解读: 首先生成数据库连接对象,conn,对象...
  • 这篇Python学习教程你那个学会了加以转化也是一个技能哦,如何批量修改数据库执行Sql文件 有时候咱们批量修改了文件,有的数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件...
  • python】MySQLdb执行sql文件命令

    千次阅读 2013-09-25 08:36:47
    纠结了半天,最后把sql文件中多余的空行及所有注释去掉,然后这样执行命令就OK了: for line in open('xxx.sql', 'r'): cursor.execute(line) 这应该是最简单的顺序执行命令方法了,但需要更改sql文件
  • python连接sqlserver,查询数据
  • 有的时候数据库也需要批量修改一下,之前的做法是使用宝塔的phpMyAdmin导出一个已经修改好了的sql文件,然后依次去其他数据库里导入,效率不说极低,也算低了,且都是些重复性的劳动,所以打算用Python来批量执行sql ...
  • I am currently writing a script to run multiple SQL files using Python, a little background before you mention alternative methods; this is to automate the scripts and Python is the only tools I have ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 118,697
精华内容 47,478
关键字:

python执行sql文件

python 订阅