Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PYODBC将数据插入datetime列会生成格式不正确的表_Python_Sql_Sql Server_Pyodbc - Fatal编程技术网

Python PYODBC将数据插入datetime列会生成格式不正确的表

Python PYODBC将数据插入datetime列会生成格式不正确的表,python,sql,sql-server,pyodbc,Python,Sql,Sql Server,Pyodbc,我目前正在编写一个程序,该程序将从excel电子表格中获取数据,并将其插入我在程序中创建的sql server表中 我之前将datetime列指定为nvarchar(250),以使整个程序正常工作,但是当我将其更改为datetime时,数据输入到错误的列中?代码的其余部分也使用nvarchar数据类型 import pyodbc connection_string = r'connection_string' data = 'file_path' conn = pyodbc.connect(

我目前正在编写一个程序,该程序将从excel电子表格中获取数据,并将其插入我在程序中创建的sql server表中

我之前将datetime列指定为nvarchar(250),以使整个程序正常工作,但是当我将其更改为datetime时,数据输入到错误的列中?代码的其余部分也使用nvarchar数据类型

import pyodbc

connection_string = r'connection_string'
data = 'file_path'

conn = pyodbc.connect(connection_string)
cur = conn.cursor()

createtable = """
create table table1(
    ID Int NULL,
    Date datetime(250) NULL,
    City nvarchar(250) NULL,
    Country nvarchar(250) NULL,
    Image nvarchar(250) NULL,
    Length nvarchar(250) NULL,
    Date_Of_capture nvarchar(250) NULL,
    Comments nvarchar(1000) NULL
    )"""

truncatetable = """truncate table table1"""

with open(data) as file:
    file.readline()
    lines = file.readlines()

if cur.tables(table="table1").fetchone():
    cur.execute(truncatetable)
    for line in lines:
        cols = line.split(',')
        cols = line.replace("'", "")
        sql = "INSERT INTO table1 VALUES({}, '{}', '{}', '{}', '{}', '{}','{}','{}')".format(cols[0], cols[1],cols[2], cols[3], cols[4], cols[5], cols[6], cols[7])
        cur.execute(sql)
else:
    cur.execute(createtable)
    for line in lines:
        cols = line.split(',')
        sql = "INSERT INTO table1 VALUES({}, '{}', '{}', '{}', '{}', '{}','{}','{}')".format(cols[0], cols[1],cols[2], cols[3], cols[4], cols[5], cols[6], cols[7])
        cur.execute(sql)

conn.commit()

conn.close()
我希望date列显示为datetime数据类型,同时包含在一列中,但它会更改表格,使所有列都不正确,并且日期的每个数字都在不同的列中


非常感谢您的帮助。谢谢。

考虑以下最佳实践:

  • 始终在
    INSERT-INTO
    甚至
    SELECT
    子句中指定列,特别是使用
    INSERT-INTO-myTable(Col1、Col2、Col3等)
    ,这有助于提高可读性和可维护性

  • 对准备好的语句使用参数化,以避免引号转义或其他重要项中的类型转换。此外,Python允许将元组传递到
    cursor.execute()
    的params参数中,而不列出每一列

  • 使用Python的
    csv
    库,通过列表或字典遍历csv文件,以实现正确对齐,并避免内存密集的
    .readlines()
    调用

  • 在一个SQL调用中组合
    CREATE TABLE
    TRUNCATE
    ,以避免
    if
    条件与游标获取调用

参见调整后的代码

import csv
...

action_query = """
    IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'mytable')
      BEGIN
        TRUNCATE TABLE table1
      END
    ELSE
      BEGIN
        CREATE TABLE table1(
           ID Int NULL,
           Date datetime NULL,
           City nvarchar(250) NULL,
           Country nvarchar(250) NULL,
           Image nvarchar(250) NULL,
           Length nvarchar(250) NULL,
           Date_Of_capture nvarchar(250) NULL,
           Comments nvarchar(1000) NULL
        )
      END
""")

cur.execute(action_query)
conn.commit()

# PREPARED STATEMENT
append_query = """INSERT INTO mytable (ID, Date, City, Country, Image, 
                                       Length, Date_Of_capture, Comments)
                  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
               """

# ITERATE THROUGH CSV AND INSERT ROWS
with open(mydatafile) as f:
    next(f) # SKIP HEADERS
    reader = csv.reader(f)

    for r in reader:
        # RUN APPEND AND BIND PARAMS
        cur.execute(append_query, params=r)
        conn.commit()

cur.close()
conn.close()

请从输入和输出中添加一些数据。我必须假设您的
create table
语句没有被执行,因为
datetime(250)
肯定会引发异常。另外,请阅读参数化查询和您的问题,向我们展示
行的样子。抱歉,我不知道如何显示数据示例?有什么建议吗?您不能在Excel文件上打开二进制格式的文件(.xls、.xlsx、.xlsm、.xlsb)。很可能,您的数据是txt或csv,两者都不是Excel文件。@Parfait-除非安装了Office,Windows会将.csv与Excel相关联,所以在这种情况下,可以原谅您认为.csv是“Excel文件”。(“嗯,我双击该文件,它将在Excel中打开…”非常感谢!不幸的是,我需要检查python中是否存在该表,因为我正在学习一门课程,但是我能够利用这一点来完成它!谢谢你的回复!很高兴听到这个消息,也很高兴能帮忙!希望您的学习课程强调参数化。