mirror of
https://github.com/Infinidat/infi.clickhouse_orm.git
synced 2025-08-02 11:10:11 +03:00
Merge 2034228b9d
into 45a9200ff6
This commit is contained in:
commit
806cf4548f
|
@ -145,6 +145,9 @@ Using the `Database` instance you can create a table for your model, and insert
|
||||||
|
|
||||||
db.create_table(Person)
|
db.create_table(Person)
|
||||||
db.insert([dan, suzy])
|
db.insert([dan, suzy])
|
||||||
|
|
||||||
|
Including the `cluster` parameter in `create_table` uses a [Distributed DDL](https://clickhouse.tech/docs/en/sql-reference/distributed-ddl/) to create the table on
|
||||||
|
the cluster.
|
||||||
|
|
||||||
The `insert` method can take any iterable of model instances, but they all must belong to the same model class.
|
The `insert` method can take any iterable of model instances, but they all must belong to the same model class.
|
||||||
|
|
||||||
|
|
55
setup.py
Normal file
55
setup.py
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
|
||||||
|
SETUP_INFO = dict(
|
||||||
|
name = 'infi.clickhouse_orm',
|
||||||
|
version = '2.1.0.post9',
|
||||||
|
author = 'Jake Lazarus',
|
||||||
|
author_email = 'jake@replicahq.com',
|
||||||
|
|
||||||
|
url = 'https://github.com/Infinidat/infi.clickhouse_orm',
|
||||||
|
license = 'BSD',
|
||||||
|
description = """A Python library for working with the ClickHouse database""",
|
||||||
|
|
||||||
|
# http://pypi.python.org/pypi?%3Aaction=list_classifiers
|
||||||
|
classifiers = [
|
||||||
|
"Intended Audience :: Developers",
|
||||||
|
"Intended Audience :: System Administrators",
|
||||||
|
"License :: OSI Approved :: BSD License",
|
||||||
|
"Operating System :: OS Independent",
|
||||||
|
"Programming Language :: Python",
|
||||||
|
"Programming Language :: Python :: 2.7",
|
||||||
|
"Programming Language :: Python :: 3.4",
|
||||||
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
||||||
|
"Topic :: Database"
|
||||||
|
],
|
||||||
|
|
||||||
|
install_requires = [
|
||||||
|
'iso8601 >= 0.1.12',
|
||||||
|
'pytz',
|
||||||
|
'requests',
|
||||||
|
'setuptools'
|
||||||
|
],
|
||||||
|
namespace_packages = ['infi'],
|
||||||
|
|
||||||
|
package_dir = {'': 'src'},
|
||||||
|
package_data = {'': []},
|
||||||
|
include_package_data = True,
|
||||||
|
zip_safe = False,
|
||||||
|
|
||||||
|
entry_points = dict(
|
||||||
|
console_scripts = [],
|
||||||
|
gui_scripts = [],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
if SETUP_INFO['url'] is None:
|
||||||
|
_ = SETUP_INFO.pop('url')
|
||||||
|
|
||||||
|
def setup():
|
||||||
|
from setuptools import setup as _setup
|
||||||
|
from setuptools import find_packages
|
||||||
|
SETUP_INFO['packages'] = find_packages('src')
|
||||||
|
_setup(**SETUP_INFO)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
setup()
|
||||||
|
|
|
@ -143,7 +143,7 @@ class Database(object):
|
||||||
self._send('DROP DATABASE `%s`' % self.db_name)
|
self._send('DROP DATABASE `%s`' % self.db_name)
|
||||||
self.db_exists = False
|
self.db_exists = False
|
||||||
|
|
||||||
def create_table(self, model_class):
|
def create_table(self, model_class, cluster=None):
|
||||||
'''
|
'''
|
||||||
Creates a table for the given model class, if it does not exist already.
|
Creates a table for the given model class, if it does not exist already.
|
||||||
'''
|
'''
|
||||||
|
@ -151,7 +151,7 @@ class Database(object):
|
||||||
raise DatabaseException("You can't create system table")
|
raise DatabaseException("You can't create system table")
|
||||||
if getattr(model_class, 'engine') is None:
|
if getattr(model_class, 'engine') is None:
|
||||||
raise DatabaseException("%s class must define an engine" % model_class.__name__)
|
raise DatabaseException("%s class must define an engine" % model_class.__name__)
|
||||||
self._send(model_class.create_table_sql(self))
|
self._send(model_class.create_table_sql(self, cluster=cluster))
|
||||||
|
|
||||||
def drop_table(self, model_class):
|
def drop_table(self, model_class):
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -348,11 +348,12 @@ class Model(metaclass=ModelBase):
|
||||||
return cls._has_funcs_as_defaults
|
return cls._has_funcs_as_defaults
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_table_sql(cls, db):
|
def create_table_sql(cls, db, cluster):
|
||||||
'''
|
'''
|
||||||
Returns the SQL statement for creating a table for this model.
|
Returns the SQL statement for creating a table for this model.
|
||||||
'''
|
'''
|
||||||
parts = ['CREATE TABLE IF NOT EXISTS `%s`.`%s` (' % (db.db_name, cls.table_name())]
|
parts = ['CREATE TABLE IF NOT EXISTS `%s`.`%s` %s (' % (
|
||||||
|
db.db_name, cls.table_name(), 'ON CLUSTER `%s`' % (cluster) if cluster else '')]
|
||||||
# Fields
|
# Fields
|
||||||
items = []
|
items = []
|
||||||
for name, field in cls.fields().items():
|
for name, field in cls.fields().items():
|
||||||
|
@ -483,12 +484,13 @@ class Model(metaclass=ModelBase):
|
||||||
class BufferModel(Model):
|
class BufferModel(Model):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_table_sql(cls, db):
|
def create_table_sql(cls, db, cluster):
|
||||||
'''
|
'''
|
||||||
Returns the SQL statement for creating a table for this model.
|
Returns the SQL statement for creating a table for this model.
|
||||||
'''
|
'''
|
||||||
parts = ['CREATE TABLE IF NOT EXISTS `%s`.`%s` AS `%s`.`%s`' % (db.db_name, cls.table_name(), db.db_name,
|
parts = ['CREATE TABLE IF NOT EXISTS `{0}`.`{1}` {2} AS `{0}`.`{3}`'.format(
|
||||||
cls.engine.main_model.table_name())]
|
db.db_name, cls.table_name(), 'ON CLUSTER `%s`' % (cluster) if cluster else '',
|
||||||
|
cls.engine.main_model.table_name())]
|
||||||
engine_str = cls.engine.create_table_sql(db)
|
engine_str = cls.engine.create_table_sql(db)
|
||||||
parts.append(engine_str)
|
parts.append(engine_str)
|
||||||
return ' '.join(parts)
|
return ' '.join(parts)
|
||||||
|
@ -506,12 +508,13 @@ class MergeModel(Model):
|
||||||
_table = StringField(readonly=True)
|
_table = StringField(readonly=True)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_table_sql(cls, db):
|
def create_table_sql(cls, db, cluster):
|
||||||
'''
|
'''
|
||||||
Returns the SQL statement for creating a table for this model.
|
Returns the SQL statement for creating a table for this model.
|
||||||
'''
|
'''
|
||||||
assert isinstance(cls.engine, Merge), "engine must be an instance of engines.Merge"
|
assert isinstance(cls.engine, Merge), "engine must be an instance of engines.Merge"
|
||||||
parts = ['CREATE TABLE IF NOT EXISTS `%s`.`%s` (' % (db.db_name, cls.table_name())]
|
parts = ['CREATE TABLE IF NOT EXISTS `%s`.`%s` %s (' % (
|
||||||
|
db.db_name, cls.table_name(), 'ON CLUSTER `%s`' % (cluster) if cluster else '')]
|
||||||
cols = []
|
cols = []
|
||||||
for name, field in cls.fields().items():
|
for name, field in cls.fields().items():
|
||||||
if name != '_table':
|
if name != '_table':
|
||||||
|
@ -590,7 +593,7 @@ class DistributedModel(Model):
|
||||||
cls.engine.table = storage_models[0]
|
cls.engine.table = storage_models[0]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create_table_sql(cls, db):
|
def create_table_sql(cls, db, cluster):
|
||||||
'''
|
'''
|
||||||
Returns the SQL statement for creating a table for this model.
|
Returns the SQL statement for creating a table for this model.
|
||||||
'''
|
'''
|
||||||
|
@ -599,8 +602,8 @@ class DistributedModel(Model):
|
||||||
cls.fix_engine_table()
|
cls.fix_engine_table()
|
||||||
|
|
||||||
parts = [
|
parts = [
|
||||||
'CREATE TABLE IF NOT EXISTS `{0}`.`{1}` AS `{0}`.`{2}`'.format(
|
'CREATE TABLE IF NOT EXISTS `{0}`.`{1}` {3} AS `{0}`.`{2}`'.format(
|
||||||
db.db_name, cls.table_name(), cls.engine.table_name),
|
db.db_name, cls.table_name(), cls.engine.table_name, 'ON CLUSTER `%s`' % (cluster) if cluster else ''),
|
||||||
'ENGINE = ' + cls.engine.create_table_sql(db)]
|
'ENGINE = ' + cls.engine.create_table_sql(db)]
|
||||||
return '\n'.join(parts)
|
return '\n'.join(parts)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user