Python PYODBC将数据插入datetime列会生成格式不正确的表
我目前正在编写一个程序,该程序将从excel电子表格中获取数据,并将其插入我在程序中创建的sql server表中 我之前将datetime列指定为nvarchar(250),以使整个程序正常工作,但是当我将其更改为datetime时,数据输入到错误的列中?代码的其余部分也使用nvarchar数据类型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(
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允许将元组传递到
的params参数中,而不列出每一列cursor.execute()
- 使用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中是否存在该表,因为我正在学习一门课程,但是我能够利用这一点来完成它!谢谢你的回复!很高兴听到这个消息,也很高兴能帮忙!希望您的学习课程强调参数化。