Python Postgresql создать базу данных и заполнить таблицу из панд данных
Я довольно новичок в Python, а также очень плохо знаком с использованием postgresql, поэтому, пожалуйста, прости меня, если это что-то базовое (чего я до сих пор не достиг). Я пытаюсь написать код Python, который:
- создает новую базу данных (
testdb
) - читает CSV-файл в фрейм данных pandas
- создает и заполняет новую таблицу в базе данных из кадра данных pandas.
Пока у меня есть 3 разных файла: .ini
-Файл, где я храню информацию базы данных, мне нужно создать новую базу данных, б) .csv
-Файл ( отсюда, по имени 100_recs.csv
) и в) мой код на питоне.
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://stackru.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)
Тем не менее, это работает, когда я делаю это, как предложено в этом посте SO. К сожалению, ответ в этом посте использует psycopg2
создать новую базу данных, но я хотел бы сделать это с sqlalchemy
(а также потому, что я думаю, что в дальнейшем работа с Pandas будет проще с sqlalchemy
(как, например, показано здесь. Или я не прав?). Я думал, что когда делаю это с sqlqlchemy
тогда должно быть возможно что-то вроде следующего, чтобы прочитать данные из csv-файла в кадр данных pandas и затем заполнить таблицу в новой базе данных:
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
# 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
РЕДАКТИРОВАТЬ 2:
Теперь он работает со следующей настройкой:
database.ini:
[postgresql]
host=localhost
user=postgres
password=postgres
port=5432
config.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
CSV-файл: отсюда
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://stackru.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'], self.params['port']
pw = self.params['password']
url = 'postgresql://{}:{}@{}:{}/{}'
url = url.format(user, pw, host, port, newdb)
self.engine = create_engine(url, client_encoding='utf8')
if not database_exists(self.engine.url):
create_database(self.engine.url)
# print(database_exists(engine.url))
def df2postgres(engine, df):
con = engine.connect()
df.to_sql(name='records', con=con, if_exists='replace', index=True, chunksize=10)
return con
if __name__ == '__main__':
testdb = MyDB()
testdb.create_new_db('testdb')
engn = testdb.engine
df = pd.read_csv('100_recs.csv', delimiter=';', quotechar='"', encoding='utf-8')
con = df2postgres(engine=engn, df=df)
dta = con.execute('SELECT * FROM records LIMIT 5;')
print(dta.fetchall())
Извиняюсь за глупые ошибки...
1 ответ
это просто модуль, который предоставляет адаптер для подключения к
Postgres
dbs с использованием
python
код. С другой стороны,
SQLAlcehmy
является
Object Relational Mapper
. Он обеспечивает дополнительный уровень абстракции, который отражает таблицы sql в объекты Python и стандартизирует операции по перемещению данных между вашим кодом и базой данных.
Вы можете использовать
psycopg2
а также
sqlalchemy
в то же время, как вы можете видеть в документации
from sqlalchemy import create_engine
engine = create_engine('postgresql+psycopg2://scott:tiger@localhost/mydatabase')