PYODBC Вставка данных в столбец datetime приводит к неверно отформатированной таблице - PullRequest
1 голос
/ 07 октября 2019

В настоящее время я пишу программу, которая будет брать данные из электронной таблицы 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()

Я ожидаю, что столбец даты будет отображаться как тип данных datetime, хотя он содержится в одном столбце, однако он меняет таблицы так, чтобы все столбцыневерны и каждая цифра даты находится в отдельном столбце?

Любая помощь с благодарностью. Спасибо.

1 Ответ

2 голосов
/ 07 октября 2019

Примите во внимание следующие рекомендации:

  • Всегда указывайте столбцы в предложениях INSERT INTO даже SELECT, особенно используйте INSERT INTO myTable (Col1, Col2, Col3, ...), что помогает в удобочитаемости и удобстве обслуживания;

  • Используйте параметризацию с подготовленным оператором, чтобы избежать экранирования кавычек или приведения типов среди других важных элементов. Кроме того, Python позволяет передавать кортежи в params аргумент cursor.execute() без перечисления каждого отдельного столбца.

  • Использование библиотеки csv Python для просмотра файлов CSVсо списками или словарем для правильного выравнивания и избежания использования памяти .readlines();

  • Объедините CREATE TABLE и TRUNCATE в одном вызове SQL, чтобы избежать 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()
...