AttributeError:“ pyodbc.Cursor”对象没有属性“方言”

时间:2020-02-25 10:35:38

标签: python sql-server sqlalchemy pyodbc

我正在尝试在数据库中创建表,因为这是我的连接,如以下代码所示:

# 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的条件

这是我发现的错误:

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更改为新连接.....

那么我该如何使用pyodbc模块解决这种情况?

已编辑

解决此问题的另一种方法是如何使用CREATE在现有DROP中的databaseSQL 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 个答案:

答案 0 :(得分:1)

您不能只导入一个完全不同的模块并期望它是相同的:)

方言是SQLalchemy用于与不同驱动程序进行通信的东西。

在这种情况下,Pyodbc是驱动程序,因此不需要方言。

来自SQLAlchemy:

Dialects

方言是SQLAlchemy用于与各种类型的DBAPI实现和数据库进行通信的系统。以下各节包含参考文档和特定于每个后端用法的注释,以及各种DBAPI的注释。

所有方言都要求安装适当的DBAPI驱动程序。

包含的方言

PostgreSQL

MySQL

SQLite

Oracle

Microsoft SQL Server


Microsoft SQL Server

对Microsoft SQL Server数据库的支持。

DBAPI支持

以下方言/ DBAPI选项可用。请参考个人 连接信息的DBAPI部分。

PyODBC

mxODBC

pymssql

zyJDBC for Jython

adodbapi

根据错误判断并查看PyODBC 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():
    ...