python postgresql从pandas dataframe创建数据库并填充表

时间:2018-03-05 22:33:49

标签: python postgresql pandas sqlalchemy sqlalchemy-utils

我是Python的新手,也是使用postgresql的新手,所以如果这是基本的东西(我到目前为止 - 未能实现),请原谅我。我正在尝试编写一个python代码:

  • 创建一个新数据库(testdb
  • 将csv文件读入pandas数据帧
  • 从pandas数据框中创建并填充数据库中的新表。

到目前为止,我有3个不同的文件:a).ini - 文件,我存储创建新数据库所需的数据库信息,b).csv - 文件(来自{{3 },名为100_recs.csv)和c)我的python代码。

database.ini

[postgresql]
host=localhost
user=postgres
password=creator
port=5432

db_creator.py

from config import config
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy_utils import database_exists, create_database
import pandas as pd

# useful info for psycopg2:
# https://stackoverflow.com/questions/34484066/create-a-postgres-database-using-python


class MyDB(object):
    def __init__(self):
        self.params = config()

    def create_new_db(self, newdb):
        user, host, port = self.params['user'], self.params['host'], testdb.params['port']
        pw = self.params['password']
        url = 'postgresql://{}:{}@{}:{}/{}'
        url = url.format(user, pw, host, port, newdb)

        engine = create_engine(url)
        if not database_exists(engine.url):
            create_database(engine.url)

        print(database_exists(engine.url))


if __name__ == '__main__':

    testdb = MyDB()
    testdb.create_new_db('testdb')

当我尝试这样做时,我收到以下错误:

  

sqlalchemy.exc.OperationalError:(psycopg2.OperationalError)

但是,按照here中的建议,它可以正常工作。不幸的是,这篇文章中的答案使用psycopg2来创建一个新的数据库,但我想用sqlalchemy来做(也因为我认为使用{{进一步使用Pandas数据帧将更容易1}}(例如显示this SO post。或者我错了吗?)。我认为当使用sqlalchemy进行操作时,应该可以将以下内容从csv文件中读取到一个pandas数据帧然后填充新数据库中的表:

sqlqlchemy

但老实说,我被困在这里需要一些帮助......如果有人能指出我正确的方向,那就太棒了。

修改: 啊傻我! 所以我在def connect_alchemy(user, host, port, db, password): url = 'postgresql://{}:{}@{}:{}/{}' url = url.format(user, password, host, port, db) con = sqlalchemy.create_engine(url, client_encoding='utf8') mydata = pd.read_csv('100_recs.csv', delimiter=';', quotechar='"') data_db = mydata.to_sql(name='100_records', con=con, if_exists='replace', index=True, chunksize=10) print(con.execute('SELECT * from 100_records'))

中的后续行中有一个旧错字
db_creator.py

应该是:

user, host, port = testdb.params['user'], testdb.params['host'], testdb.params['port']
        pw = testdb.params['password']

我已经改变了这一点。

然后我也忘了在这里添加user, host, port = self.params['user'], self.params['host'], self.params['port'] pw = self.params['password'] 文件。为此道歉。

你走了:

config.py

config.py

编辑2

现在可以使用以下设置:

database.ini

# source: http://www.postgresqltutorial.com/postgresql-python/connect/
from configparser import ConfigParser


def config(filename='database.ini', section='postgresql'):
    # create a parser
    parser = ConfigParser()
    # read config file
    parser.read(filename)

    # get section, default to postgresql
    db = {}
    if parser.has_section(section):
        params = parser.items(section)
        for param in params:
            db[param[0]] = param[1]
    else:
        raise Exception('Section {0} not found in the {1} file'.format(section, filename))

    return db

config.py

[postgresql]
host=localhost
user=postgres
password=postgres
port=5432

csv文件:来自here

db_creator.py

# source: http://www.postgresqltutorial.com/postgresql-python/connect/
from configparser import ConfigParser


def config(filename='database.ini', section='postgresql'):
    # create a parser
    parser = ConfigParser()
    # read config file
    parser.read(filename)

    # get section, default to postgresql
    db = {}
    if parser.has_section(section):
        params = parser.items(section)
        for param in params:
            db[param[0]] = param[1]
    else:
        raise Exception('Section {0} not found in the {1} file'.format(section, filename))

    return db

为愚蠢的错误道歉...

0 个答案:

没有答案