源码阅读学习笔记-kennethreitz/records SQL for Humans™

封装sql查询语句,方便快捷,对人友好;
学习总结:
1、特殊的构造方法学习,__getitem__ __getattr__ 实现方式,以及用途;
2、
# -*- coding: utf-8 -*-

import os
from collections import OrderedDict  #collections是Python内建的一个集合模块,提供了许多有用的集合类,这里使用了有序的dict;
from inspect import isclass  #查看python 类的参数和模块、函数代码

import tablib  #第三方模块,主要作用是将数据导出为各种不同的格式
from docopt import docopt
from sqlalchemy import create_engine, inspect, text  #最有名的ORM框架SQLAlchemy,Object-Relational Mapping,把关系数据库的表结构映射到对象上

DATABASE_URL = os.environ.get('DATABASE_URL')


def isexception(obj):   #内置函数使用 ,判断类型 ,貌似不符合python的多态思想;
    """Given an object, return a boolean indicating whether it is an instance
    or subclass of :py:class:`Exception`.
    """
    if isinstance(obj, Exception):
        return True
    if isclass(obj) and issubclass(obj, Exception):
        return True
    return False


class Record(object):
    """A row, from a query, from a database."""
    __slots__ = ('_keys', '_values')   #限制该class能添加的属性,对子类无效

    def __init__(self, keys, values):
        self._keys = keys
        self._values = values

        # Ensure that lengths match properly.
        assert len(self._keys) == len(self._values)  #断言,判断条件是否符合,false 引发异常

    def keys(self):
        """Returns the list of column names from the query."""
        return self._keys

    def values(self):
        """Returns the list of values from the query."""
        return self._values

    def __repr__(self):
        return '<Record {}>'.format(self.export('json')[1:-1])

    def __getitem__(self, key):    #拦截索引运算符;迭代器会先尝试__iter__方法,在尝试__getitem__.也就是如果对象不支持迭代协议,就会尝试索引运算
                                   #迭代是通过调用__iter__方法来实现的,这种方法返回一个迭代器对象,如果有就会重复调用这个迭代器对象的next方法,
                                   #直至发生StopIteration异常,如果没找到这类__iter__方法,Python就会改用__getitem__机制,通过偏移量重复索引,直至发生IndexError异常

        # Support for index-based lookup.
        if isinstance(key, int):
            return self.values()[key]

        # Support for string-based lookup.
        if key in self.keys():
            i = self.keys().index(key)
            return self.values()[i]

        raise KeyError("Record contains no '{}' field.".format(key))

    def __getattr__(self, key):      #拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果可以找到该属性,则不调用此方法
        try:
            return self[key]
        except KeyError as e:
            raise AttributeError(e)

    def __dir__(self):                    #dir()  
        standard = dir(super(Record, self))
        # Merge standard attrs with generated ones (from column names).
        return sorted(standard + [str(k) for k in self.keys()])

    def get(self, key, default=None):
        """Returns the value for a given key, or default."""
        try:
            return self[key]
        except KeyError:
            return default

    def as_dict(self, ordered=False):
        """Returns the row as a dictionary, as ordered."""
        items = zip(self.keys(), self.values())

        return OrderedDict(items) if ordered else dict(items)  #又见if 表达式赋值

    @property
    def dataset(self):
        """A Tablib Dataset containing the row."""
        data = tablib.Dataset()
        data.headers = self.keys()

        row = _reduce_datetimes(self.values())
        data.append(row)

        return data

    def export(self, format, **kwargs):
        """Exports the row to the given format."""
        return self.dataset.export(format, **kwargs)


class RecordCollection(object):
    """A set of excellent Records from a query."""
    def __init__(self, rows):
        self._rows = rows
        self._all_rows = []
        self.pending = True

    def __repr__(self):
        return '<RecordCollection size={} pending={}>'.format(len(self), self.pending)

    def __iter__(self):
        """Iterate over all rows, consuming the underlying generator
        only when necessary."""
        i = 0
        while True:
            # Other code may have iterated between yields,
            # so always check the cache.
            if i < len(self):
                yield self[i]
            else:
                # Throws StopIteration when done.
                # Prevent StopIteration bubbling from generator, following https://www.python.org/dev/peps/pep-0479/
                try:
                    yield next(self)
                except StopIteration:
                    return
            i += 1

    def next(self):
        return self.__next__()

    def __next__(self):
        try:
            nextrow = next(self._rows)
            self._all_rows.append(nextrow)
            return nextrow
        except StopIteration:
            self.pending = False
            raise StopIteration('RecordCollection contains no more rows.')

    def __getitem__(self, key):
        is_int = isinstance(key, int)

        # Convert RecordCollection[1] into slice.
        if is_int:
            key = slice(key, key + 1)

        while len(self) < key.stop or key.stop is None:
            try:
                next(self)
            except StopIteration:
                break

        rows = self._all_rows[key]
        if is_int:
            return rows[0]
        else:
            return RecordCollection(iter(rows))

    def __len__(self):
        return len(self._all_rows)

    def export(self, format, **kwargs):
        """Export the RecordCollection to a given format (courtesy of Tablib)."""
        return self.dataset.export(format, **kwargs)

    @property
    def dataset(self):
        """A Tablib Dataset representation of the RecordCollection."""
        # Create a new Tablib Dataset.
        data = tablib.Dataset()

        # If the RecordCollection is empty, just return the empty set
        # Check number of rows by typecasting to list
        if len(list(self)) == 0:
            return data

        # Set the column names as headers on Tablib Dataset.
        first = self[0]

        data.headers = first.keys()
        for row in self.all():
            row = _reduce_datetimes(row.values())
            data.append(row)

        return data

    def all(self, as_dict=False, as_ordereddict=False):
        """Returns a list of all rows for the RecordCollection. If they haven't
        been fetched yet, consume the iterator and cache the results."""

        # By calling list it calls the __iter__ method
        rows = list(self)

        if as_dict:
            return [r.as_dict() for r in rows]
        elif as_ordereddict:
            return [r.as_dict(ordered=True) for r in rows]

        return rows

    def as_dict(self, ordered=False):
        return self.all(as_dict=not(ordered), as_ordereddict=ordered)

    def first(self, default=None, as_dict=False, as_ordereddict=False):
        """Returns a single record for the RecordCollection, or `default`. If
        `default` is an instance or subclass of Exception, then raise it
        instead of returning it."""

        # Try to get a record, or return/raise default.
        try:
            record = self[0]
        except IndexError:
            if isexception(default):
                raise default
            return default

        # Ensure that we don't have more than one row.
        try:
            self[1]
        except IndexError:
            pass
        else:
            raise ValueError('RecordCollection contains too many rows.')

        # Cast and return.
        if as_dict:
            return record.as_dict()
        elif as_ordereddict:
            return record.as_dict(ordered=True)
        else:
            return record

class Database(object):
    """A Database connection."""

    def __init__(self, db_url=None, **kwargs):
        # If no db_url was provided, fallback to $DATABASE_URL.
        self.db_url = db_url or DATABASE_URL

        if not self.db_url:
            raise ValueError('You must provide a db_url.')

        self._engine = create_engine(self.db_url, **kwargs)

        # Connect to the database.
        self.db = self._engine.connect()
        self.open = True

    def close(self):
        """Closes the connection to the Database."""
        self.db.close()
        self.open = False

    def __enter__(self):
        return self

    def __exit__(self, exc, val, traceback):
        self.close()

    def __repr__(self):
        return '<Database open={}>'.format(self.open)

    def get_table_names(self, internal=False):
        """Returns a list of table names for the connected database."""

        # Setup SQLAlchemy for Database inspection.
        return inspect(self._engine).get_table_names()

    def query(self, query, fetchall=False, **params):
        """Executes the given SQL query against the Database. Parameters
        can, optionally, be provided. Returns a RecordCollection, which can be
        iterated over to get result rows as dictionaries.
        """

        # Execute the given query.
        cursor = self.db.execute(text(query), **params) # TODO: PARAMS GO HERE

        # Row-by-row Record generator.
        row_gen = (Record(cursor.keys(), row) for row in cursor)

        # Convert psycopg2 results to RecordCollection.
        results = RecordCollection(row_gen)

        # Fetch all results if desired.
        if fetchall:
            results.all()

        return results

    def bulk_query(self, query, *multiparams):
        """Bulk insert or update."""

        self.db.execute(text(query), *multiparams)

    def query_file(self, path, fetchall=False, **params):
        """Like Database.query, but takes a filename to load a query from."""

        # If path doesn't exists
        if not os.path.exists(path):
            raise IOError("File '{}'' not found!".format(path))

        # If it's a directory
        if os.path.isdir(path):
            raise IOError("'{}' is a directory!".format(path))

        # Read the given .sql file into memory.
        with open(path) as f:
            query = f.read()

        # Defer processing to self.query method.
        return self.query(query=query, fetchall=fetchall, **params)

    def bulk_query_file(self, path, *multiparams):
        """Like Database.bulk_query, but takes a filename to load a query from."""

         # If path doesn't exists
        if not os.path.exists(path):
            raise IOError("File '{}'' not found!".format(path))

        # If it's a directory
        if os.path.isdir(path):
            raise IOError("'{}' is a directory!".format(path))

        # Read the given .sql file into memory.
        with open(path) as f:
            query = f.read()

        self.db.execute(text(query), *multiparams)

    def transaction(self):
        """Returns a transaction object. Call ``commit`` or ``rollback``
        on the returned object as appropriate."""
        return self.db.begin()

def _reduce_datetimes(row):
    """Receives a row, converts datetimes to strings."""

    row = list(row)

    for i in range(len(row)):
        if hasattr(row[i], 'isoformat'):
            row[i] = row[i].isoformat()
    return tuple(row)

def cli():
    cli_docs ="""Records: SQL for Humans™
A Kenneth Reitz project.
Usage:
  records <query> [<format>] [<params>...] [--url=<url>]
  records (-h | --help)
Options:
  -h --help     Show this screen.
  --url=<url>   The database URL to use. Defaults to $DATABASE_URL.
Supported Formats:
   csv, tsv, json, yaml, html, xls, xlsx, dbf, latex, ods
   Note: xls, xlsx, dbf, and ods formats are binary, and should only be
         used with redirected output e.g. '$ records sql xls > sql.xls'.
Query Parameters:
    Query parameters can be specified in key=value format, and injected
    into your query in :key format e.g.:
    $ records 'select * from repos where language ~= :lang' lang=python
Notes:
  - While you may specify a database connection string with --url, records
    will automatically default to the value of $DATABASE_URL, if available.
  - Query is intended to be the path of a SQL file, however a query string
    can be provided instead. Use this feature discernfully; it's dangerous.
  - Records is intended for report-style exports of database queries, and
    has not yet been optimized for extremely large data dumps.
    """
    supported_formats = 'csv tsv json yaml html xls xlsx dbf latex ods'.split()

    # Parse the command-line arguments.
    arguments = docopt(cli_docs)

    # Create the Database.
    db = Database(arguments['--url'])

    query = arguments['<query>']
    params = arguments['<params>']

    # Can't send an empty list if params aren't expected.
    try:
        params = dict([i.split('=') for i in params])
    except ValueError:
        print('Parameters must be given in key=value format.')
        exit(64)

    # Execute the query, if it is a found file.
    if os.path.isfile(query):
        rows = db.query_file(query, **params)

    # Execute the query, if it appears to be a query string.
    elif len(query.split()) > 2:
        rows = db.query(query, **params)

    # Otherwise, say the file wasn't found.
    else:
        print('The given query could not be found.')
        exit(66)

    # Print results in desired format.
    if arguments['<format>']:
        print(rows.export(arguments['<format>']))
    else:
        print(rows.dataset)

# Run the CLI when executed directly.
if __name__ == '__main__':
cli()

Pingbacks已打开。

引用地址

评论
  1. 우리카지노 우리카지노 发布于 2020年11月30日 01:45 #

    Hello my family member! I wish to say that this
    article is amazing, nice written and come with approximately all
    vital infos. I would like to peer extra posts like this .

  2. 우리카지노 우리카지노 发布于 2020年11月30日 01:46 #

    Hello my family member! I wish to say that this article is amazing, nice written and come with
    approximately all vital infos. I would like to peer extra posts like this .

  3. 우리카지노 우리카지노 发布于 2020年11月30日 01:55 #

    What's up, I desire to subscribe for this website to take most recent updates, therefore where can i do it please help.

  4. 우리카지노 우리카지노 发布于 2020年11月30日 01:56 #

    What's up, I desire to subscribe for this website to
    take most recent updates, therefore where can i do
    it please help.

  5. 파라오카지노 파라오카지노 发布于 2020年11月30日 02:06 #

    Hi, I do believe this is a great website.

    I stumbledupon it

  6. 파라오카지노 파라오카지노 发布于 2020年11月30日 02:07 #

    Hi, I do believe this is a great website. I stumbledupon it

  7. white472.venkataranga.com white472.venkataranga.com 发布于 2020年11月30日 02:28 #

    Highly descriptive post, I enjoyed that bit. Will there be a part 2?

  8. watson902.wonodds35.com watson902.wonodds35.com 发布于 2020年11月30日 02:38 #

    Appreciating the time and energy you put into your blog and in depth information you present.
    It's good to come across a blog every once in a while that isn't the same old rehashed information. Fantastic read!
    I've saved your site and I'm including your RSS feeds to my Google account.

  9. watson902.wonodds35.com watson902.wonodds35.com 发布于 2020年11月30日 02:38 #

    Appreciating the time and energy you put into your blog
    and in depth information you present. It's good to come across a blog every once in a while that
    isn't the same old rehashed information. Fantastic read!
    I've saved your site and I'm including your RSS feeds
    to my Google account.

  10. SmmHob SmmHob 发布于 2020年11月30日 03:01 #

    Отложенный постинг в инстаграм [url=https://postingall.ru/ ]и в остальные соц сети VK Прокси и другие мощные инструменты[/url]

  11. 예스카지노 예스카지노 发布于 2020年11月30日 03:03 #

    Superb blog you have here but I was wanting to know if you knew of any discussion boards that cover the
    same topics discussed here? I'd really like to be a part of
    online community where I can get advice from other knowledgeable individuals that
    share the same interest. If you have any recommendations, please let me know.
    Kudos!

  12. 예스카지노 예스카지노 发布于 2020年11月30日 03:03 #

    Superb blog you have here but I was wanting to know if you knew of any discussion boards that
    cover the same topics discussed here? I'd really like
    to be a part of online community where I can get advice from other knowledgeable individuals that share the same interest.

    If you have any recommendations, please let me know.
    Kudos!

  13. AmyGal AmyGal 发布于 2020年11月30日 03:09 #

    [url=https://tadalafilnova.com/]buy cialis 10mg[/url]

  14. 카지노사이트 카지노사이트 发布于 2020年11月30日 03:10 #

    You've made some good points there. I checked on the internet for more info about the issue and found most individuals
    will go along with your views on this website.

  15. 카지노사이트 카지노사이트 发布于 2020年11月30日 03:10 #

    You've made some good points there. I checked on the internet for more
    info about the issue and found most individuals will go along with your views on this website.

  16. clark685.greekaro.com clark685.greekaro.com 发布于 2020年11月30日 03:16 #

    With havin so much content do you ever run into any problems of plagorism or copyright violation? My website
    has a lot of unique content I've either created myself or outsourced but it appears a lot of
    it is popping it up all over the web without my permission. Do
    you know any ways to help reduce content from being
    stolen? I'd truly appreciate it.

  17. clark685.greekaro.com clark685.greekaro.com 发布于 2020年11月30日 03:16 #

    With havin so much content do you ever run into any problems
    of plagorism or copyright violation? My website has
    a lot of unique content I've either created myself or outsourced but it appears a lot of it is
    popping it up all over the web without my permission. Do you know any ways to help reduce content from being stolen? I'd truly appreciate it.

  18. Live Webcams Sex Live Webcams Sex 发布于 2020年11月30日 03:21 #

    [url=http://sexcamdip.com/]freesexcam[/url]

  19. 카지노사이트 카지노사이트 发布于 2020年11月30日 03:22 #

    I’m not that much of a internet reader to be honest but your sites really nice, keep it up!
    I'll go ahead and bookmark your site to come
    back later. Many thanks

  20. 카지노사이트 카지노사이트 发布于 2020年11月30日 03:23 #

    I’m not that much of a internet reader to be honest but your sites really nice, keep it up!
    I'll go ahead and bookmark your site to come back later.

    Many thanks

  21. 우리카지노 우리카지노 发布于 2020年11月30日 03:25 #

    Hi, I wish for to subscribe for this webpage to obtain newest updates, thus
    where can i do it please help out.

  22. 우리카지노 우리카지노 发布于 2020年11月30日 03:25 #

    Hi, I wish for to subscribe for this webpage to obtain newest updates, thus where can i do it please help out.

  23. 예스카지노 예스카지노 发布于 2020年11月30日 03:27 #

    Awesome blog you have here but I was curious about if you knew of any user discussion forums that cover the same topics discussed in this article?
    I'd really like to be a part of online community where
    I can get responses from other knowledgeable people that share the
    same interest. If you have any suggestions, please let me know.
    Appreciate it!

  24. 예스카지노 예스카지노 发布于 2020年11月30日 03:28 #

    Awesome blog you have here but I was curious about if
    you knew of any user discussion forums that
    cover the same topics discussed in this article?
    I'd really like to be a part of online community where I
    can get responses from other knowledgeable people that share the same interest.

    If you have any suggestions, please let me know.
    Appreciate it!

  25. 파라오카지노 파라오카지노 发布于 2020年11月30日 03:30 #

    I'm curious to find out what blog system you have been utilizing?

    I'm having some minor security problems with my latest website and
    I'd like to find something more risk-free.
    Do you have any suggestions?

  26. 파라오카지노 파라오카지노 发布于 2020年11月30日 03:30 #

    I'm curious to find out what blog system you have been utilizing?
    I'm having some minor security problems with my
    latest website and I'd like to find something more risk-free.
    Do you have any suggestions?

  27. 더킹카지노 더킹카지노 发布于 2020年11月30日 03:32 #

    Hey There. I found your weblog using msn. This is a very smartly written article.
    I'll make sure to bookmark it and come back to read extra
    of your helpful info. Thank you for the post. I'll definitely comeback.

  28. 더킹카지노 더킹카지노 发布于 2020年11月30日 03:32 #

    Hey There. I found your weblog using msn. This is a very smartly written article.
    I'll make sure to bookmark it and come back to read extra of your helpful info.
    Thank you for the post. I'll definitely comeback.

  29. 우리카지노 우리카지노 发布于 2020年11月30日 03:33 #

    Hello, Neat post. There is a problem with your
    web site in web explorer, would check this? IE nonetheless is the marketplace
    chief and a good component of other folks will omit your magnificent writing because of this problem.

  30. 우리카지노 우리카지노 发布于 2020年11月30日 03:33 #

    Hello, Neat post. There is a problem with your web site in web explorer, would check this?

    IE nonetheless is the marketplace chief and a good component
    of other folks will omit your magnificent writing because of this problem.

  31. 바카라사이트 바카라사이트 发布于 2020年11月30日 03:43 #

    What's Happening i'm new to this, I stumbled upon this I've discovered It positively helpful and it has
    aided me out loads. I hope to contribute & aid other customers like its helped me.

    Great job.

  32. 바카라사이트 바카라사이트 发布于 2020年11月30日 03:43 #

    What's Happening i'm new to this, I stumbled upon this I've
    discovered It positively helpful and it has aided me out loads.
    I hope to contribute & aid other customers like its helped me.
    Great job.

  33. walker782.themediaengagers.com walker782.themediaengagers.com 发布于 2020年11月30日 03:44 #

    Great website you have here but I was curious if you knew of any discussion boards that
    cover the same topics talked about in this article? I'd really love to be a part of group where I can get
    responses from other knowledgeable people that share the same interest.
    If you have any suggestions, please let me know. Cheers!

  34. walker782.themediaengagers.com walker782.themediaengagers.com 发布于 2020年11月30日 03:44 #

    Great website you have here but I was curious if you knew of any discussion boards that cover the same
    topics talked about in this article? I'd really love to be a part of group where I can get responses from other knowledgeable people that share the same interest.
    If you have any suggestions, please let me know.

    Cheers!

  35. 예스카지노 예스카지노 发布于 2020年11月30日 03:47 #

    Thanks for your personal marvelous posting!
    I actually enjoyed reading it, you will be a great author. I will be sure to bookmark your blog and definitely will come back
    sometime soon. I want to encourage yourself to continue your great work, have a
    nice holiday weekend!

  36. 예스카지노 예스카지노 发布于 2020年11月30日 03:47 #

    Thanks for your personal marvelous posting! I actually enjoyed reading it,
    you will be a great author. I will be sure to bookmark your blog
    and definitely will come back sometime soon. I want to encourage yourself to continue your great work, have a nice holiday
    weekend!

  37. 바카라 바카라 发布于 2020年11月30日 04:05 #

    I feel that is one of the so much important information for me.
    And i'm satisfied reading your article. However should statement on some general things, The website
    style is great, the articles is truly excellent
    : D. Excellent task, cheers

  38. 바카라 바카라 发布于 2020年11月30日 04:05 #

    I feel that is one of the so much important information for me.
    And i'm satisfied reading your article. However should statement on some general things, The website style is great, the
    articles is truly excellent : D. Excellent task, cheers

  39. wood329.wonodds85.com wood329.wonodds85.com 发布于 2020年11月30日 04:08 #

    Hello! I just wanted to ask if you ever have any problems
    with hackers? My last blog (wordpress) was hacked and
    I ended up losing a few months of hard work due to no data backup.
    Do you have any methods to stop hackers?

  40. wood329.wonodds85.com wood329.wonodds85.com 发布于 2020年11月30日 04:08 #

    Hello! I just wanted to ask if you ever have any problems with hackers?

    My last blog (wordpress) was hacked and I ended up losing a few months of hard work due to no data backup.
    Do you have any methods to stop hackers?

  41. Antoniospous Antoniospous 发布于 2020年11月30日 04:10 #

    https://sildgeneric100.com/ cheap sildenafil
    <a href=" https://canadaedgeneric.com/# ">compare pharmacy prices for prescriptions</a> canadian pharmacy
    [url=https://paydayloanstrust1h.com/#]payday loans direct lenders[/url] personal loans for bad credit

  42. 파라오카지노 파라오카지노 发布于 2020年11月30日 04:11 #

    Hello there! Do you use Twitter? I'd like to follow you
    if that would be ok. I'm undoubtedly enjoying your blog
    and look forward to new updates.

  43. 파라오카지노 파라오카지노 发布于 2020年11月30日 04:12 #

    Hello there! Do you use Twitter? I'd like to follow you if that would be ok.
    I'm undoubtedly enjoying your blog and look forward to new updates.

  44. patel744.mhwide.com patel744.mhwide.com 发布于 2020年11月30日 04:40 #

    Saved as a favorite, I love your website!

  45. 우리카지노 우리카지노 发布于 2020年11月30日 04:59 #

    I like the valuable information you provide in your articles.
    I will bookmark your blog and check again here regularly.
    I'm quite certain I will learn plenty of new stuff right here!
    Best of luck for the next!

  46. 우리카지노 우리카지노 发布于 2020年11月30日 04:59 #

    I like the valuable information you provide in your
    articles. I will bookmark your blog and check again here regularly.

    I'm quite certain I will learn plenty of new stuff right here!

    Best of luck for the next!

  47. https://roberts841.ybsotomotiv.com/1.html https://roberts841.ybsotomotiv.com/1.html 发布于 2020年11月30日 04:59 #

    Asking questions are actually pleasant thing if you are not understanding something totally, except
    this post gives good understanding even.

  48. https://roberts841.ybsotomotiv.com/1.html https://roberts841.ybsotomotiv.com/1.html 发布于 2020年11月30日 05:00 #

    Asking questions are actually pleasant thing if you are not understanding something totally, except this post gives good understanding even.

  49. mitchell241.woodpecker-tr.com mitchell241.woodpecker-tr.com 发布于 2020年11月30日 05:09 #

    Wonderful blog! Do you have any suggestions for aspiring
    writers? I'm hoping to start my own blog soon but I'm a little lost
    on everything. Would you propose starting with a free platform
    like Wordpress or go for a paid option? There are
    so many options out there that I'm completely confused ..
    Any tips? Many thanks!

  50. mitchell241.woodpecker-tr.com mitchell241.woodpecker-tr.com 发布于 2020年11月30日 05:09 #

    Wonderful blog! Do you have any suggestions for aspiring writers?
    I'm hoping to start my own blog soon but I'm a little lost on everything.
    Would you propose starting with a free platform
    like Wordpress or go for a paid option? There are so many
    options out there that I'm completely confused .. Any tips?
    Many thanks!

  51. harris671.classicroyalgroup.com harris671.classicroyalgroup.com 发布于 2020年11月30日 05:26 #

    Paragraph writing is also a fun, if you be familiar with after that you
    can write otherwise it is difficult to write.

  52. harris671.classicroyalgroup.com harris671.classicroyalgroup.com 发布于 2020年11月30日 05:26 #

    Paragraph writing is also a fun, if you be familiar with after that you can write otherwise it is difficult to
    write.

  53. https://smith131.w-god.com/archives/1 https://smith131.w-god.com/archives/1 发布于 2020年11月30日 05:34 #

    We're a group of volunteers and opening a new scheme in our community.

    Your web site offered us with valuable information to work on. You have done a formidable job and our whole community will be grateful to you.

  54. https://smith131.w-god.com/archives/1 https://smith131.w-god.com/archives/1 发布于 2020年11月30日 05:34 #

    We're a group of volunteers and opening a new scheme in our community.
    Your web site offered us with valuable information to work on. You have done a formidable job and
    our whole community will be grateful to you.

  55. Marianofleda Marianofleda 发布于 2020年11月30日 05:51 #

    [url=https://zp.vgorode.ua/reference/sotsyalnye_uchrezhdenyia/283866-advokat-zaporozhe]юристы Запорожье [/url]

  56. SamGal SamGal 发布于 2020年11月30日 06:00 #

    [url=http://cialismn.com/]buy generic cialis pills[/url] [url=http://cialisos.com/]tadalafil for sale canada[/url] [url=http://levitranorx.com/]vardenafil without prescription[/url] [url=http://levitravarde.com/]vardenafil generic india[/url] [url=http://genuinecialis.com/]cialis in mexico cost[/url] [url=http://onlinepharmacymay.com/]best value pharmacy[/url] [url=http://pharmacytopp.com/]american pharmacy[/url] [url=http://kamagrat.com/]buy kamagra oral jelly canada[/url]

  57. 카지노사이트 카지노사이트 发布于 2020年11月30日 06:00 #

    Every weekend i used to pay a visit this website, because i want enjoyment, since this this
    web site conations genuinely nice funny information too.

  58. 카지노사이트 카지노사이트 发布于 2020年11月30日 06:00 #

    Every weekend i used to pay a visit this website, because i want enjoyment, since this
    this web site conations genuinely nice funny information too.

  59. williams327.izmirescort-ara1.com williams327.izmirescort-ara1.com 发布于 2020年11月30日 06:05 #

    you are truly a good webmaster. The website loading pace is incredible.

    It kind of feels that you are doing any unique trick.
    Moreover, The contents are masterwork. you've performed a magnificent process in this matter!

  60. williams327.izmirescort-ara1.com williams327.izmirescort-ara1.com 发布于 2020年11月30日 06:05 #

    you are truly a good webmaster. The website loading pace
    is incredible. It kind of feels that you are doing any unique trick.
    Moreover, The contents are masterwork. you've performed a magnificent process in this matter!

  61. phillips827.our-tips.com phillips827.our-tips.com 发布于 2020年11月30日 06:23 #

    Nice blog here! Also your site loads up fast!

    What web host are you using? Can I get your affiliate
    link to your host? I wish my web site loaded up as quickly as yours lol

  62. phillips827.our-tips.com phillips827.our-tips.com 发布于 2020年11月30日 06:23 #

    Nice blog here! Also your site loads up fast! What web host are you using?
    Can I get your affiliate link to your host? I wish my web site loaded up as quickly
    as yours lol

  63. wilso549.muazbeyribey.com wilso549.muazbeyribey.com 发布于 2020年11月30日 06:31 #

    wonderful post, very informative. I ponder why the opposite specialists of this sector don't understand this.
    You must continue your writing. I'm sure, you have a huge readers'
    base already!

  64. wilso549.muazbeyribey.com wilso549.muazbeyribey.com 发布于 2020年11月30日 06:31 #

    wonderful post, very informative. I ponder
    why the opposite specialists of this sector don't understand this.
    You must continue your writing. I'm sure, you have a huge readers' base
    already!

  65. 카지노사이트 카지노사이트 发布于 2020年11月30日 06:42 #

    I always used to study paragraph in news papers but now
    as I am a user of web therefore from now I am using
    net for content, thanks to web.

  66. 카지노사이트 카지노사이트 发布于 2020年11月30日 06:43 #

    I always used to study paragraph in news papers but now as
    I am a user of web therefore from now I am using net for content, thanks
    to web.

  67. AnnaGal AnnaGal 发布于 2020年11月30日 07:07 #

    [url=http://buyaurogra.com/]aurogra[/url] [url=http://lyrica24.com/]generic lyrica 2017[/url] [url=http://antidepressantsbuy.com/]ashwagandha insomnia[/url] [url=http://orderantibiotics.com/]omnicef price in india[/url]

  68. JasonGal JasonGal 发布于 2020年11月30日 07:19 #

    [url=http://tadalafilnt.com/]tadalafil 20mg price generic[/url] [url=http://viagrasol.com/]sildenafil 30 mg[/url] [url=http://lyricaonline.com/]can you buy lyrica online[/url] [url=http://orderantibiotics.com/]floxin antibiotic[/url] [url=http://sildenafilnsi.com/]generic viagra paypal[/url] [url=http://sildenafilst.com/]sildenafil 20 mg tablet cost[/url] [url=http://icepharmacy.com/]online pharmacy dubai[/url] [url=http://cialisen.com/]cheapest brand cialis[/url] [url=http://cialismn.com/]cialis generic no prescription[/url] [url=http://tadalafilpos.com/]tadalafil - generic[/url]

  69. 예스카지노 예스카지노 发布于 2020年11月30日 07:35 #

    Hey just wanted to give you a quick heads up and let you know a few of the images
    aren't loading correctly. I'm not sure why but I think its a linking
    issue. I've tried it in two different browsers and both show the same results.

  70. 예스카지노 예스카지노 发布于 2020年11月30日 07:35 #

    Hey just wanted to give you a quick heads up and let you know
    a few of the images aren't loading correctly. I'm not sure why but I think its a linking
    issue. I've tried it in two different browsers and both show the same results.

  71. motorcycle insurance motorcycle insurance 发布于 2020年11月30日 07:41 #

    [url=http://autoinsurancedream.com/]progressive auto insurance[/url]

  72. AmyGal AmyGal 发布于 2020年11月30日 08:00 #

    [url=https://genuinecialis.com/]how to buy cialis without a prescription[/url]

  73. 더킹카지노 더킹카지노 发布于 2020年11月30日 08:02 #

    My spouse and I stumbled over here by a different web address and
    thought I should check things out. I like what I see so now i'm following
    you. Look forward to looking over your web page yet again.

  74. EdwardClisp EdwardClisp 发布于 2020年11月30日 08:10 #

    ed prescription drugs https://canadaedgeneric.com/ buy generic drugs cheap tablets

  75. SueGal SueGal 发布于 2020年11月30日 08:44 #

    [url=https://fildenamed.com/]where to buy fildena[/url] [url=https://dexamethasone365.com/]dexamethasone 1.5 tablet[/url] [url=https://icepharmacy.com/]online pharmacy in germany[/url] [url=https://viagraup.com/]how to buy viagra online usa[/url] [url=https://genuinecialis.com/]where to buy generic cialis online safely[/url] [url=https://lyrica24.com/]lyrica cheap price[/url] [url=https://viagrasolo.com/]brand viagra online australia[/url] [url=https://budesonide24.com/]budesonide 0.5 mg[/url] [url=https://cialistem.com/]india generic cialis[/url] [url=https://modafinil365.com/]modafinil pills for sale[/url]

  76. williams663.sweetsimplyjenny.com williams663.sweetsimplyjenny.com 发布于 2020年11月30日 08:48 #

    Hey there, I think your blog might be having browser
    compatibility issues. When I look at your blog in Opera, it looks fine but when opening
    in Internet Explorer, it has some overlapping. I just wanted
    to give you a quick heads up! Other then that, terrific
    blog!

  77. williams663.sweetsimplyjenny.com williams663.sweetsimplyjenny.com 发布于 2020年11月30日 08:48 #

    Hey there, I think your blog might be having browser compatibility issues.
    When I look at your blog in Opera, it looks fine but when opening in Internet Explorer, it has some overlapping.
    I just wanted to give you a quick heads up! Other then that,
    terrific blog!

  78. 파라오카지노 파라오카지노 发布于 2020年11月30日 08:57 #

    What's up, this weekend is nice in favor of me, for the reason that this occasion i am reading this enormous educational article here at my residence.

  79. 파라오카지노 파라오카지노 发布于 2020年11月30日 08:57 #

    What's up, this weekend is nice in favor of me, for the reason that this occasion i am reading
    this enormous educational article here at my residence.

  80. MarkGal MarkGal 发布于 2020年11月30日 09:04 #

    [url=https://onlinepharmacy360.com/]online pharmacy without insurance[/url] [url=https://cialisbz.com/]generic tadalafil price[/url]

  81. anderson267.dreebangladesh.com anderson267.dreebangladesh.com 发布于 2020年11月30日 09:12 #

    I don't know whether it's just me or if perhaps everybody else encountering problems with
    your blog. It looks like some of the text within your posts are running off the screen. Can someone else please comment and let
    me know if this is happening to them too? This may be a issue with my internet browser because I've had this happen before.

    Kudos

  82. anderson267.dreebangladesh.com anderson267.dreebangladesh.com 发布于 2020年11月30日 09:12 #

    I don't know whether it's just me or if perhaps everybody else encountering problems with your blog.
    It looks like some of the text within your posts are running
    off the screen. Can someone else please comment and let
    me know if this is happening to them too? This may be a issue with
    my internet browser because I've had this happen before.
    Kudos

发表评论