【问题标题】:How to insert data in oracle database in a cycle from python?如何从python循环插入oracle数据库中的数据?
【发布时间】:2021-07-02 09:25:51
【问题描述】:

晚上好!

这里有错误:

文件“E:\scripts\trytoconnecttoconnecttoOracledb.py”,第 79 行,在 connect_to_oracle_database cursor.execute(sql_insert)

TypeError: 期望字符串或字节对象

我想动态插入数据并查看我的表格填充了生成的数据

我的代码是:

它适用于注释行,但是当我尝试动态执行时,我遇到了麻烦

import cx_Oracle
import datetime
from datetime import date 
import pandas as pd


def connect_to_oracle_database(delta, d0):
    
    connection = cx_Oracle.connect('anton_gridushko/anton_gridushko@xe')
    print(connection.version)
    cursor = connection.cursor()
    
    # creatnion part:
    creation_parameters = ("DIM_DATES", "DATE_ID", "DAY_IN_WEEK_NUMBER", "DAY_IN_MONTH_NUMBER", "DAY_NAME", "WEEKDAY_FLAG", "WEEK_IN_YEAR_NUMBER", "MONTH_IN_YEAR_NUMBER", "MONTH_NAME", "QUARTER_NUMBER", "YEAR_NUMBER")
    statement = """
    CREATE TABLE %s(
        %s DATE NOT NULL,
        %s NUMBER NOT NULL,
        %s NUMBER NOT NULL,
        %s VARCHAR2(40 BYTE) NOT NULL,
        %s VARCHAR2(40 BYTE) NOT NULL,
        %s NUMBER NOT NULL,
        %s NUMBER NOT NULL,
        %s VARCHAR2(40 BYTE) NOT NULL,
        %s NUMBER NOT NULL,
        %s NUMBER NOT NULL
        )
    """% creation_parameters
    
    cursor.execute(statement)
    print("Table created")
    
    cursor = connection.cursor()
    # statement = 'INNSERT INTO DIM_DATES(DATE_ID, DAY_IN_WEEK_NUMBER, DAY_IN_MONTH_NUMBER, DAY_NAME, WEEKDAY_FLAG, WEEK_IN_YEAR_NUMBER, MONTH_IN_YEAR_NUMBER, MONTH_NAME, QUARTER_NUMBER, YEAR_NUMBER) VALUES (:2, :3, :4, :5, :6, :7, :8, :9, :10, :11)'
    # cursor.execute(statement, (1,3,11,2,4,20,5,3,2,1960))
    
    date = d0
    for i in range(delta.days):
        date += datetime.timedelta(days=1)
        
        # date_id = datetime(date.strftime("%d %b %Y"))
        date_id = date
        dinweeknum = int(date.weekday())
        dinmonthnumber = int(date.strftime("%d"))
        dayname = date.strftime("%A")    
        weekno = int(date.weekday())   
        if (weekno < 5): dayflag = "Weekday" 
        else: 
            dayflag = "Weekend"        
        wnum = int(date.isocalendar()[1])
        mnum = int(date.strftime("%m"))
        mname = date.strftime("%B")
        quarter = int(pd.Timestamp(date).quarter)
        yeardate = int(date.strftime("%Y"))
        
        # cursor.execute("INSERT INTO word VALUES (?, ?)", (var1, var2))
        
        # var1 = date_id
        # var2 = dinweeknum + 1
        # var3 = dinmonthnumber
        # var4 = dayname
        # var5 = dayflag
        # var6 = wnum
        # var7 = mnum
        # var8 = mname
        # var9 = quartere
        # var10 = yeardate
        
        
        sql_insert = """INSERT INTO DIM_DATES VALUES (TO_DATE('2001-01-01', 'YYYY-MM-DD'), 1, 1, 'Aaa', 'Bbb', 1, 1, 'Ccc', 2, ?)""", dinweeknum
        
        # sql_insert = """INSERT INTO DIM_DATES VALUES (f'TO_DATE('{date_id}', 'YYYY-MM-DD'), {dinweeknum + 1}, {dinmonthnumber}, {dayname}, {dayflag}, {wnum}, {mnum}, {mname}, {quarter}, {yeardate}')"""
        
        # sql_insert = """
        #                INSERT INTO DIM_DATES VALUES (TO_DATE(?, 'YYYY-MM-DD'), ?, ?, ?, ?, ?, ?, ?, ?, ?)
        #                """, (var1, var2, var3, var4, var5, var6, var7, var8, var9, var10)
                       
        cursor.execute(sql_insert)
        
    connection.commit()   
    # dispose part:
    cursor.close()
    connection.close()

#Main area
d1 = date(2030, 12, 31)
d0 = date(1969, 12, 31)
delta = d1 - d0

connect_to_oracle_database(delta, d0)  

【问题讨论】:

    标签: python sql pandas oracle spyder


    【解决方案1】:

    不清楚您在说什么(您有很多注释行,但没有说明它们各自的作用)。如果您询问绑定,请使用 Oracle 的绑定语法,如 BindInsert.py 等 cx_Oracle 示例中所示。该示例还显示了使用executemany(),这是插入多个数据行的非常有效的方式。

    一个例子是:

    dataToInsert = [
        (10, 'Parent 10'),
        (20, 'Parent 20'),
        (30, 'Parent 30'),
        (40, 'Parent 40'),
        (50, 'Parent 50')
    ]
    cursor.executemany("insert into ParentTable values (:1, :2)", dataToInsert)
    

    您应该避免在单个 execute() 上循环,因为这会慢得多。

    查看 cx_Oracle 文档 Using Bind VariablesBatch Statement Execution and Bulk Loading

    【讨论】:

      猜你喜欢
      • 2016-02-25
      • 2020-05-13
      • 2019-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多