AttributeError: у объекта 'pyodb c .Cursor' нет атрибута 'диалект' - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать таблицу в базе данных, так как это мое соединение, как показано ниже:

# pyodbc connection connect to server
conn = pyodbc.connect(
    "driver={SQL Server};server=xxxxxxxxxxx; database=master; trusted_connection=true",
    autocommit=True, Trusted_Connection='Yes')
crsr = conn.cursor()

# connect db (connect to database name) using SQL-Alchemy

engine = create_engine(
    'mssql+pyodbc://xxxxxxxxxxx/master?driver=SQL+Server+Native+Client+11.0')
connection = engine.connect()

это просто pyodbc conncetion

, и это ошибка, которую я обнаружил :

Traceback (most recent call last):
  File "C:/Users/haroo501/PycharmProjects/ToolUpdated/app.py", line 22, in <module>
    dfeed_gsm_relation_m.push_dfeed_gsm_relation_sql()
  File "C:\Users\haroo501\PycharmProjects\ToolUpdated\meta_data\dfeed_gsm_relation_m.py", line 31, in push_dfeed_gsm_relation_sql
    if connec.crsr.dialect.has_table(connec.crsr, DATAF_GSM_RELATION):
AttributeError: 'pyodbc.Cursor' object has no attribute 'dialect'

и это код, который создает таблицу в базе данных, используя MetaData():

from sqlalchemy import MetaData, Table, Column, Integer, String, Date, Float
from database import connec
import sqlalchemy as db
import pandas as pd
import numpy as np
from txt_to_csv import convert_to_csv
import os

def push_dfeed_gsm_relation_sql():
    # Create a ditionary for all gsm_relations_mnm relation excel file
    dataf_gsm_relation_col_dict = {
        'cell_name': 'Cellname',
        'n_cell_name': 'Ncellname',
        'technology': 'Technology',
    }
    # table name in database 'df_gsm_relation'
    DATAF_GSM_RELATION = 'df_gsm_relation'

    # Create a list for dataf_gsm_relation_cols and put the dictionary in the list
    dataf_gsm_relation_cols = list(dataf_gsm_relation_col_dict.keys())

    dataf_gsm_relation_cols_meta = MetaData()
    dataf_gsm_relation_relations = Table(
        DATAF_GSM_RELATION, dataf_gsm_relation_cols_meta,
        Column('id', Integer, primary_key=True),
        Column(dataf_gsm_relation_cols[0], Integer),
        Column(dataf_gsm_relation_cols[1], Integer),
        Column(dataf_gsm_relation_cols[2], String),
    )

    if connec.crsr.dialect.has_table(connec.crsr, DATAF_GSM_RELATION):
        dataf_gsm_relation_relations.drop(connec.crsr)
    dataf_gsm_relation_cols_meta.create_all(connec.crsr)

    dataf_gsm_rel_txt = 'gsmrelation_mnm.txt'
    dataf_gsm_txt_df = pd.read_csv(dataf_gsm_rel_txt, sep=';')
    dataf_gsm_rel_df_column_index = list(dataf_gsm_txt_df.columns)
    dataf_gsm_txt_df.reset_index(inplace=True)
    dataf_gsm_txt_df.drop(columns=dataf_gsm_txt_df.columns[-1], inplace=True)
    dataf_gsm_rel_df_column_index = dict(zip(list(dataf_gsm_txt_df.columns), dataf_gsm_rel_df_column_index))
    dataf_gsm_txt_df.rename(columns=dataf_gsm_rel_df_column_index, inplace=True)
    dataf_gsm_txt_df.to_excel('gsmrelation_mnm.xlsx', 'Sheet1', index=False)

    dataf_gsm_rel_excel = 'gsmrelation_mnm.csv'

    dataf_gsm_rel_df = pd.read_csv(os.path.join(os.path.dirname(__file__), dataf_gsm_rel_excel), dtype={
        dataf_gsm_relation_col_dict[dataf_gsm_relation_cols[0]]: int,
        dataf_gsm_relation_col_dict[dataf_gsm_relation_cols[1]]: int,
        dataf_gsm_relation_col_dict[dataf_gsm_relation_cols[2]]: str,
    })

    dataf_gsm_relations_table_query = db.insert(dataf_gsm_relation_relations)
    dataf_gsm_relations_values_list = []
    dataf_gsm_relations_row_count = 1
    for i in dataf_gsm_rel_df.index:
        dataf_gsm_relations_row = dataf_gsm_rel_df.loc[i]
        dataf_gsm_rel_df_record = {'id': dataf_gsm_relations_row_count}
        for col in dataf_gsm_relation_col_dict.keys():
            if col == dataf_gsm_relation_cols[0] or col == dataf_gsm_relation_cols[1]:
                dataf_gsm_rel_df_record[col] = int(dataf_gsm_relations_row[dataf_gsm_relation_col_dict[col]])
            else:
                dataf_gsm_rel_df_record[col] = dataf_gsm_relations_row[dataf_gsm_relation_col_dict[col]]
        dataf_gsm_relations_values_list.append(dataf_gsm_rel_df_record)
        dataf_gsm_relations_row_count += 1
    ResultProxy_dataf_gsm_relations = connec.crsr.execute(dataf_gsm_relations_table_query,
                                                     dataf_gsm_relations_values_list)

в качестве проблемы в этой части:

    if connec.crsr.dialect.has_table(connec.crsr, DATAF_GSM_RELATION):
        dataf_gsm_relation_relations.drop(connec.crsr)
    dataf_gsm_relation_cols_meta.create_all(connec.crsr)

Я знаю, что dialect функция связана с from sqlalchemy import create_engine, и это мое старое соединение, когда я перешел на новое соединение, используя import pyodbc .....

Так как я могу решить этот случай, используя * Модуль 1022 *?

Отредактировано

Другой способ решить эту проблему - как CREATE и DROP таблицы в существующих database с использованием SQL ALCHEMY

и это пример кода:

from database import connec

def create_db():
    create_bd_query = "CREATE DATABASE MyNewDatabase"
    connec.crsr.execute(create_bd_query)

def delete_database():
    delete_bd_query = "DROP DATABASE MyNewDatabase"
    connec.crsr.execute(delete_bd_query)

1 Ответ

1 голос
/ 25 февраля 2020

Вы не можете просто импортировать совершенно другой модуль и ожидать, что он будет одинаковым:)

Диалекты - это то, что SQLalchemy использует для связи с различными драйверами.

В этом случае Pyodb c Это водитель, поэтому он не нуждается в диалекте.

Из SQLAlchemy:

Диалекты

Диалект - это система, которую SQLAlchemy использует для связи с различными типами Реализации DBAPI и базы данных. В следующих разделах содержится справочная документация и примечания, указывающие c на использование каждого бэкэнда, а также примечания для различных DBAPI.

Все диалекты требуют, чтобы был установлен соответствующий драйвер DBAPI.

диалекты

PostgreSQL

MySQL

SQLite

Oracle

Microsoft SQL Сервер


Microsoft SQL Сервер

Поддержка для базы данных Microsoft SQL Server.

Поддержка DBAPI

Доступны следующие параметры диалекта / DBAPI. Информацию о подключении см. В отдельных разделах DBAPI.

PyODB C

mxODB C

pyms sql

zxJDB C для Jython

adodbapi

Судя по ошибке и взглянув на PyODB C Wiki Documentation

Я думаю, что эта строка:

if connec.crsr.dialect.has_table(connec.crsr, DATAF_GSM_RELATION):

следует читать:

# Does table 'DATAF_GSM_RELATION' exist?
if connec.crsr.tables(table=DATAF_GSM_RELATION).fetchone():
    ...
...