2014-12-18 26 views
5

Python'dan bir MS Access veritabanı oluşturmaya çalışıyorum ve bir panda veri dosyasından doğrudan bir tablo oluşturmanın mümkün olup olmadığını merak ediyorum. Veritabanını bir SQLite veritabanına veya başka bir veritabanı formatı için sqlalchemy motorunu kullanarak (ama maalesef Access maalesef) başarılı bir şekilde yazmak için pandalar dataframe.to_sql() işlevini kullanabileceğimi biliyorum, ancak tüm parçaları parçalayamıyorum. İşte test ettiğimiz kod snippet'ine:Python MS Access Veritabanı Tablosu Oluşturma Pandalar Dataframe Kullanma SQLAlchemy

import pandas as pd 
import sqlalchemy 
import pypyodbc  # Used to actually create the .mdb file 
import pyodbc 

# Connection function to use for sqlalchemy 
def Connection(): 
    MDB = 'C:\\database.mdb' 
    DRV = '{Microsoft Access Driver (*.mdb)}' 
    connection_string = 'Driver={Microsoft Access Driver (*.mdb)};DBQ=%s' % MDB 
    return pyodbc.connect('DRIVER={};DBQ={}'.format(DRV,MDB)) 


# Try to connect to the database 
try: 
    Conn = Connection() 
# If it fails because its not been created yet, create it and connect to it 
except: 
    pypyodbc.win_create_mdb(MDB) 
    Conn = Connection() 

# Create the sqlalchemy engine using the pyodbc connection 
Engine = sqlalchemy.create_engine('mysql+pyodbc://', creator=Connection) 

# Some dataframe 
data = {'Values'  : [1., 2., 3., 4.], 
     'FruitsAndPets' : ["Apples", "Oranges", "Puppies", "Ducks"]} 
df = pd.DataFrame(data) 

# Try to send it to the access database (and fail) 
df.to_sql('FruitsAndPets', Engine, index = False) 

Ben ne yapmaya çalışıyorum kullanıyorum güncel paketleri ile bile mümkün olduğundan emin değilim ama burada önce kontrol etmek istedim Kendi kişisel veri tabanımı MS Access tablo işlevine yazarım. Belki benim sqlalchemy motorum yanlış ayarlanmış mı?

cursor.execute(statement, parameters) 
sqlalchemy.exc.DBAPIError: (Error) ('HY000', "[HY000] [Microsoft][ODBC Microsoft Access Driver] Could not find file 'C:\\INFORMATION_SCHEMA.mdb'. (-1811) (SQLExecDirectW)") u'SELECT [COLUMNS_1].[TABLE_SCHEMA], [COLUMNS_1].[TABLE_NAME], [COLUMNS_1].[COLUMN_NAME], [COLUMNS_1].[IS_NULLABLE], [COLUMNS_1].[DATA_TYPE], [COLUMNS_1].[ORDINAL_POSITION], [COLUMNS_1].[CHARACTER_MAXIMUM_LENGTH], [COLUMNS_1].[NUMERIC_PRECISION], [COLUMNS_1].[NUMERIC_SCALE], [COLUMNS_1].[COLUMN_DEFAULT], [COLUMNS_1].[COLLATION_NAME] \nFROM [INFORMATION_SCHEMA].[COLUMNS] AS [COLUMNS_1] \nWHERE [COLUMNS_1].[TABLE_NAME] = ? AND [COLUMNS_1].[TABLE_SCHEMA] = ?' (u'FruitsAndPets', u'dbo') 

ve motorda mysql+pyodbc için biten hata: Burada

motorda mssql+pyodbc ile benim hata sonu

cursor.execute(statement, parameters) 
sqlalchemy.exc.ProgrammingError: (ProgrammingError) ('42000', "[42000] [Microsoft][ODBC Microsoft Access Driver] Invalid SQL statement; expected 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT', or 'UPDATE'. (-3500) (SQLExecDirectW)") "SHOW VARIABLES LIKE 'character_set%%'"() 

Sadece nota, ben eğer umurumda değil Ben sqlalchemy veya pandalar kullanıyorum to_sql() Ben sadece kolayca MS Access veritabanına bir dataframe almak için kolay bir yol arıyorum. Eğer JSON'a dökülürse, SQL kullanarak satırlar eklemek için bir döngü fonksiyonu varsa, her ne olursa olsun, iyi çalışırsa onu alırım.

cevap

1

bir Access veritabanını SQL komutları yürütme ve doldurma için pypyodbc web sitesinde kısa bir öğretici vardır:

mxODBC'un MS Access ile çalışma yeteneğine sahip olduğunu belirtir. Uzun zaman önce, MS Access'e bağlanmak için ADOdb'u başarıyla kullandığımı düşünüyorum.

Birkaç yıl önce, SQLAlchemy Microsoft Access için deneysel destek sağladı. Access veritabanını o zaman MS SQL Server'a taşımak için kullandım. Veritabanını otomatik olarak yüklemek/yansıtmak için SQLAlchemy kullandım. Çok kullanışlıdı. Kodun 0,5 sürümünde olduğuna inanıyorum. Ne yaptığım hakkında bir şeyler okuyabilirsin here.

1

Buna hâlâ bakanlar için, temelde MS Access için pandas toql metodunu büyük zorluk çekmeden kullanamazsınız. Eğer bu şekilde yapmak için kararlı iseniz, burada biri sqlalchemy en Erişim lehçesi sabit bir bağlantı (ve muhtemelen OP'ın kod Engine ile çalışacak) 'dir:

connecting sqlalchemy to MSAccess

bir veri çerçevesi almanın en iyi yolu MS Access içine kayıtlardan INSERT heykelleri inşa etmek, daha sonra basitçe pyodbc veya pypyodbc üzerinden bağlanmak ve bir imleç ile yürütmek. Her seferinde bir tane eklemeniz gerekir, muhtemelen çok fazla veriye sahipseniz, bunu 5000'e kadar parçalara ayırın.